Java break語句詳解

2020-07-16 10:05:03
在 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 Test24
{
    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 標籤所代表的最外層迴圈終止。