web-dev-qa-db-ja.com

Javaでは、ブレークはネストされたループとどのように相互作用しますか?

breakステートメントはループから飛び出しますが、ネストされたループから飛び出しますか、それとも現在入っているループから飛び出しますか?

38
Craig

装飾がない場合、breakは最も内側のループから抜け出します。したがって、このコードでは:

while (true) { // A
    while (true) { // B
         break;
    }
}

breakはループBのみを終了するため、コードは永久にループします。

ただし、Javaには、「名前付きブレーク」と呼ばれる機能があり、ループに名前を付けてから、どのループから抜け出すかを指定できます。次に例を示します。

A: while (true) {
    B: while (true) {
         break A;
    }
}

breakはループAを明示的に残すため、このコードは永久にループしません。

幸いなことに、これと同じロジックがcontinueに対して機能します。デフォルトでは、continuecontinueステートメントを含む最も内側のループの次の反復を実行しますが、ループのラベルを指定して継続するように外側のループ反復にジャンプすることもできます実行中。

CやC++などのJava以外の言語では、この「ラベル付きブレーク」ステートメントは存在せず、多重にネストされたループから抜け出すことは容易ではありません。これはgotoステートメントを使用して実行できますが、通常は眉をひそめます。たとえば、Dijkstraのアドバイスを無視してgotoを使用する場合は、Cでネストされたブレークがどのように見えるかを示します。

while (true) {
    while (true) {
        goto done;
    }
}
done:
   // Rest of the code here.

お役に立てれば!

81
templatetypedef

デフォルトでは、最も内側のループから飛び出します。ただし、 ラベルを指定して外側のループにジャンプさせる もできます。

4
biziclop

例外を使用して脱出することもできるため、複数の理由に対処できます

 void fkt1() {
    try {
        while (true)
            fkt2();
    } catch (YourAbortException e) {
        e.printStackTrace();
    }

    //go on
}

void fkt2() {
    while (true)
        if (abort)
            throw new YourAbortException();
}
0