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


分享到:


相關文章: