break
ステートメントはループから飛び出しますが、ネストされたループから飛び出しますか、それとも現在入っているループから飛び出しますか?
装飾がない場合、break
は最も内側のループから抜け出します。したがって、このコードでは:
while (true) { // A
while (true) { // B
break;
}
}
break
はループB
のみを終了するため、コードは永久にループします。
ただし、Javaには、「名前付きブレーク」と呼ばれる機能があり、ループに名前を付けてから、どのループから抜け出すかを指定できます。次に例を示します。
A: while (true) {
B: while (true) {
break A;
}
}
break
はループA
を明示的に残すため、このコードは永久にループしません。
幸いなことに、これと同じロジックがcontinue
に対して機能します。デフォルトでは、continue
はcontinue
ステートメントを含む最も内側のループの次の反復を実行しますが、ループのラベルを指定して継続するように外側のループ反復にジャンプすることもできます実行中。
CやC++などのJava以外の言語では、この「ラベル付きブレーク」ステートメントは存在せず、多重にネストされたループから抜け出すことは容易ではありません。これはgoto
ステートメントを使用して実行できますが、通常は眉をひそめます。たとえば、Dijkstraのアドバイスを無視してgoto
を使用する場合は、Cでネストされたブレークがどのように見えるかを示します。
while (true) {
while (true) {
goto done;
}
}
done:
// Rest of the code here.
お役に立てれば!
デフォルトでは、最も内側のループから飛び出します。ただし、 ラベルを指定して外側のループにジャンプさせる もできます。
例外を使用して脱出することもできるため、複数の理由に対処できます
void fkt1() {
try {
while (true)
fkt2();
} catch (YourAbortException e) {
e.printStackTrace();
}
//go on
}
void fkt2() {
while (true)
if (abort)
throw new YourAbortException();
}