10分鐘掌握特殊迴圈關鍵字

作者 | 吳懿罡

出品 | 百數雲課(專注網際網路知識共享,官方公眾號:百數雲課)

背景引入

在 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 標籤所代表的最外層迴圈終止。