- Javaでのラベル付きステートメントの使用は、中断して続行するだけですか?
- プログラムでラベル付きステートメントを使用したのはいつですか。
申し訳ありませんが、コードスニペットは削除されました。私は質問を分割しています
申し訳ありませんが、コードスニペットは削除されました。私は質問を分割しています
(明確にするために編集)
ステートメントにはラベルプレフィックスが付いている場合があります(識別子:ステートメント)。識別子は、すぐに含まれるステートメントのラベルであると宣言されています。
CやC++とは異なり、Javaプログラミング言語には
goto
ステートメントがありません。識別子ステートメントラベルは、ラベル付きステートメント内の任意の場所に表示されるbreak
(§14.15)またはcontinue
(§14.16)ステートメントとともに使用されます。
したがって、JLSは、ラベルがbreak
またはcontinue
で使用され、Javaプログラミング言語の他の文法要素がそれを使用しないことを明確にしています。
厳密に言えば、break
ラベルcontinue
付けされているかどうかに関係なく、必要になることはありません。それらはいつでもコードから書き出すことができます。ただし、慣用的に使用すると、コードが読みやすくなる可能性があります。
これが実例です:与えられたint[]
、私達はしたい:
"One (1)"
に印刷1
"Two (2)"
に印刷2
"Zero "
に印刷0
他の番号の処理をすぐに停止します
int[] arr = { 1, 2, 0, 1, -1, 0, 2 };
loop:
for (int num : arr) {
switch (num) {
case 1:
System.out.print("One ");
break;
case 2:
System.out.print("Two ");
break;
case 0:
System.out.print("Zero ");
continue loop;
default:
break loop;
}
System.out.print("(" + num + ") ");
}
// prints "One (1) Two (2) Zero One (1) "
ここで、次のことがわかります。
switch
break
は、switch
ケース間の「フォールスルー」を回避するために使用されますcontinue loop;
は、後処理をスキップするために使用されますcase 0:
(ここではラベルは必要ありません)break loop;
は、ループを終了するために使用されますdefault:
(ここではラベルが必要です。それ以外の場合はswitch break
)break
したがって、 /というラベルcontinue
はネストされたループの外部でも使用できます。switch
aがループ内にネストされている場合に使用できます。より一般的には、複数のbreak
/ターゲットが存在する可能性があり、 /ステートメントcontinue
をすぐに囲まないものを選択する場合に使用されます。break
continue
別の例を次に示します。
morningRoutine: {
phase1: eatBreakfast();
if (grumpy) break morningRoutine;
phase2: kissWife();
phase3: hugChildren();
}
http://stackoverflow.com is the best website ever!
これは、ラベルbreak
が反復ステートメント内ではなく、単純なブロックステートメント内で使用されている別のケースです。ラベルは読みやすさを向上させると主張する人もいるかもしれません。この点は主観的です。
いいえ、最後の行ではコンパイル時エラーは発生しません。これは、実際にはJavaパズル22:URLの複製に触発されています。残念ながら、パズルはラベル付けされたステートメントの「適切な」使用にさらに深く入り込むことはありません。
はい、 Javabreak
でcontinue
のラベル付きステートメントの2つの用途はこれだけです。(Javaにはgoto
ステートメントがありません。)
ラベルを使用して、ネストされたループから抜け出すことができます。
outer:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.println("Hello");
continue outer;
} // end of inner loop
System.out.println("outer"); // Never prints
}
System.out.println("Good-Bye");
ラベルにcontinue
戻るとouter
、printステートメントを含め、内側と外側の両方のループの残りの部分をスキップしています。
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length; j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search;
}
}
}