Javaでbreak文/continue文/ラベル

f:id:monozukuri-bu:20190721175346j:plain

みちです。
Javaのbreak文、continue文、ラベルについて勉強していきたいと思います。

break文

break文は、繰り返し処理を中断し抜け出すときに使用されます。
繰り返し処理を抜けた後は、その後の実行文に制御が移ります。

    class Main{
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                if (i == 5) {
                    break;
                }
                System.out.println(i);
            }
            System.out.println("抜けた後の処理");
        }
    }

結果

0
1
2
3
4
抜けた後の処理

if文でi=5のときにbreak文forによって、文の繰り返し処理を中断しfor文を抜けた後の処理が実行されていることがわかりました。

continue文

continue文は、繰り返し処理内の残っている処理を飛ばして条件式に制御を移します。
そのあと繰り返し処理を続けるときに使われます。

       class Main{
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                if (i == 5) {
                    System.out.println("処理を飛ばします");
                    continue;
                }
                System.out.println(i);
            }
        }
    }

結果

0
1
2
3
4
処理を飛ばします
6
7
8
9

i=5のときにif文の中に入りcontinue文が実行されるため、5が出力されずに条件式に制御が移され、残りの繰り返し処理を行います。

ラベル

繰り返し処理文が二重になっている場合に、内側の繰り返し処理文内でbreak文、continue文を実行しても内側の繰り返し処理文しか抜けたり、飛ばしたりすることが出来ません。

そこで、ループにラベルをつけることで、ネストの深いループも一度に抜けることができます。

break文で2重ループを一気に抜ける

        class Test { 
            public static void main(String[] args) {
            loopBreak:  
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    System.out.println("i =" + i + " " + "j =" + j);
                    if (i==1 && j==1) {
                        break loopBreak;
                    }
                }
            }
            }
        }

結果

i =0 j =0
i =0 j =1
i =0 j =2
i =1 j =0
i =1 j =1

i =1, j =1のときにbreak文が実行され、それ以降の処理が行われていないことがわかります。
2重ループを一気に抜けることができました。

continue文で2重ループの処理を飛ばす

         class Test { 
            public static void main(String[] args) {
            loopContinue:  
                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 3; j++) {
                        System.out.println("i =" + i + " " + "j =" + j);
                        if (i==1 && j==1) {
                            continue loopContinue;
                        }
                    }
                }
            }
        }

結果

i =0 j =0
i =0 j =1
i =0 j =2
i =1 j =0
i =1 j =1
i =2 j =0
i =2 j =1
i =2 j =2

i=1,j=1の時にラベルの付いたcontinue文によって、外側のfor文に制御が移ります。
結果を見るとi=1,j=1の後のi=1,j=2が実行されずに飛ばされたことがわかります。

ループ以外でラベルを使う

なお、ラベルはブロックから抜ける動作のため、ループでなくてもブロックであれば成り立ちます。

class Test {
    public static void main(String[] args) {
        int i = 1;
        int j = 1;
        label: {
            if (i == 1) {
                System.out.println("i = " + i);
                if (j == 1) {
                    break label;
                }
                System.out.println("a");
            }
        }
        System.out.println("break後");
    }
}

結果

i = 0
break後

ラベルなしの場合は内側のif文を抜けるだけなのでaも出力されるはずですが、ラベルを使うことで内側と外側のif文を抜けて処理が終了されています。

まとめ

今回はbreak文、continue文、ラベルついて勉強しました。