作者 | 吳懿罡
出品 | 百數雲課(專注互聯網知識共享,官方公眾號:百數雲課)
背景引入
在 Java 中,break 語句有 3 種作用,分別是:在 switch 語句中終止一個語句序列、使用 break 語句直接強行退出循環和使用 break 語句實現 goto 的功能。
在 switch 語句中終止一個語句序列
在 switch 語句中終止一個語句序列,就是在每個 case 子句塊的最後添加語句“break;”,
使用 break 語句直接強行退出循環
可以使用 break 語句強行退出循環,忽略循環體中的任何其他語句和循環的條件判斷。在循環中遇到 break 語句時,循環被終止,在循環後面的語句重新開始。
例 1
小明參加了一個 1000 米的長跑比賽,在 100 米的跑道上,他循環地跑著,每跑一圈,剩餘路程就會減少 100 米,要跑的圈數就是循環的次數。但是,在每跑完一圈時,教練會問他是否要堅持下去,如果回答 y,則繼續跑,否則表示放棄。
使用 break 語句直接強行退出循環的示例如下:
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in); //定義變量存儲小明的回答
String answer=""; //一圈100米,1000米為10圈,即為循環的次數
for(int i=0;i<10;i++)
{
System.out.println("跑的是第"+(i+1)+"圈");
System.out.println("還能堅持嗎?"); //獲取小明的回答
answer=input.next(); //判斷小明的回答是否為y?如果不是,則放棄,跳出循環
if(!answer.equals("y"))
{
System.out.println("放棄");
break;
}
// 循環之後的代碼
System.out.println("加油!繼續!");
}
}
}
- 該程序運行後的效果如下所示:
跑的是第1圈
還能堅持嗎?
y
加油!繼續!
跑的是第2圈
還能堅持嗎?
y
加油!繼續!
跑的是第3圈
還能堅持嗎?
n
放棄
- 儘管 for 循環被設計為從 0 執行到 10,但是當小明的回答不是 y 時,break 語句終止了程序的循環,繼續執行循環體外的代碼,輸出“加油!繼續!”。
break 語句能用於任何 Java循環中,包括人們有意設置的無限循環。在一系列嵌套循環中使用 break 語句時,它將僅僅終止最裡面的循環。例如:
public class BreakDemo1
{
public static void main(String[] args)
{
//外循環,循環5次
for (int i=0;i<5;i++)
{
System.out.print("第"+(i+1)+"次循環:");
//內循環,設計為循環10次
for(int j=0;j<10;j++)
{
//判斷j是否等於3,如果是,則終止循環
if(j==3)
{
break;
}
System.out.print("內循環的第"+(j+1)+"次循環\t");
}
System.out.println();
}
}
}
- 該程序運行結果如下所示:
第1次循環:內循環的第1次循環 內循環的第2次循環 內循環的第3次循環
第2次循環:內循環的第1次循環 內循環的第2次循環 內循環的第3次循環
第3次循環:內循環的第1次循環 內循環的第2次循環 內循環的第3次循環
第4次循環:內循環的第1次循環 內循環的第2次循環 內循環的第3次循環
第5次循環:內循環的第1次循環 內循環的第2次循環 內循環的第3次循環
從程序運行結果來看,在內部循環中的 break 語句僅僅終止了所在的內部循環,外部循環沒有受到任何的影響。
注意:一個循環中可以有一個以上的 break 語句,但是過多的 break 語句會破壞代碼結構。switch 循環語句中的 break 僅影響 switch 語句,不會影響循環。
例 2
- 編寫一個 Java 程序,允許用戶輸入 6 門課程成績,如果錄入的成績為負則跳出循環;如果錄入 6 門合法成績,則計算已有成績之和。
使用 break 語句的實現代碼如下:
public class Test25
{
public static void main(String[] args)
{
int score; //每門課的成績
int sum=0; //成績之和
boolean con=true; //記錄錄入的成績是否合法
Scanner input=new Scanner(System.in);
System.out.println("請輸入學生的姓名:");
String name=input.next(); //獲取用戶輸入的姓名
for(int i=1;i<=6;i++)
{
System.out.println("請輸入第"+i+"門課程的成績:");
score=input.nextInt();//獲取用戶輸入的成績
if(score<0)
{ //判斷用戶輸入的成績是否為負數,如果為負數,終止循環
con=false;
break;
}
sum=sum+score; //累加求和
}
if(con)
{
System.out.println(name+"的總成績為:"+sum);
}
else
{
System.out.println("抱歉,分數錄入錯誤,請重新錄入!");
}
}
}
- 運行程序,當用戶錄入的分數低於 0 時,則輸出“抱歉,分數錄入錯誤,請重新錄入!”信息,否則打印學生的總成績。輸出結果如下所示。
請輸入學生的姓名:
zhangpu
請輸入第1門課程的成績:
100
請輸入第2門課程的成績:
75
請輸入第3門課程的成績:
-8
抱歉,分數錄入錯誤,請重新錄入!
請輸入學生的姓名:
zhangpu
請輸入第1門課程的成績:
100
請輸入第2門課程的成績:
68
請輸入第3門課程的成績:
73
請輸入第4門課程的成績:
47
請輸入第5門課程的成績:
99
請輸入第6門課程的成績:
84
zhangpu的總成績為:471
在該程序中,當錄入第 3 門課的成績時,錄入的成績為負數,判斷條件“score<0”為 true,執行“con=false”,用 con 來標記錄入是否有誤。接著執行 break 語句,執行完之後程序並沒有繼續執行條件語句後面的語句,而是直接退出 for 循環。之後執行下面的條件判斷語句,判斷 boolean 變量的 con 是否為 true,如果為 true,則打印總成績;否則打印“抱歉,分數錄入錯誤,請重新錄入!”。
使用 break 語句實現 goto 的功能
break 語句可以實現 goto 的功能,並且 Java 定義了 break 語句的一種擴展形式來處理退出嵌套很深的循環這個問題。
通過使用擴展的 break 語句,可以終止執行一個或者幾個任意代碼塊,這些代碼塊不必是一個循環或一個 switch 語句的一部分。同時這種擴展的 break 語句帶有標籤,可以明確指定從何處重新開始執行。
break 除了具有 goto 退出深層循環嵌套作用外,還保留了一些程序結構化的特性。
標籤 break 語句的通用格式如下:
break label;
label 是標識代碼塊的標籤。當執行這種形式的 break 語句時,控制權被傳遞出指定的代碼塊。被加標籤的代碼塊必須包圍 break 語句,但是它不需要直接包圍 break 的塊。也就是說,可以使用一個加標籤的 break 語句來退出一系列的嵌套快,但是不能使用 break 語句將控制權傳遞到不包含 break 語句的代碼塊。
用標籤(label)可以指定一個代碼塊,標籤可以是任何合法有效的 Java 標識符,後跟一個冒號。加上標籤的代碼塊可以作為 break 語句的對象,使程序在加標籤的塊的結尾繼續執行。
- 下面是使用帶標籤的break 語句的示例。
public class GotoDemo
{
public static void main(String[] args)
{
label:for(int i=0;i<10;i++)
{
for(int j=0;j<8;j++)
{
System.out.println(j);
if(j%2!=0)
{
break label;
}
}
}
}
}
以上程序的執行結果為:
0
1
這裡的 label 是標籤的名稱,可以為 Java 語言中任意合法的標識符。標籤語句必須和循環匹配使用,使用時書寫在對應的循環語句的上面,標籤語句以冒號結束。如果需要中斷標籤語句對應的循環,可以採用 break 後面跟標籤名的方式。
如在上面代碼中,當 j 為 1 時,“j%2!=0”條件表達式成立,則 label 標籤所代表的最外層循環終止。