8
  • Javaでのラベル付きステートメントの使用は、中断して続行するだけですか?
  • プログラムでラベル付きステートメントを使用したのはいつですか。

申し訳ありませんが、コードスニペットは削除されました。私は質問を分割しています

4

3 に答える 3

20

JLS14.7ラベル付きステートメント

(明確にするために編集)

ステートメントにはラベルプレフィックスが付いている場合があります(識別子ステートメント)。識別子は、すぐに含まれるステートメントのラベルであると宣言されています。

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:(ここではラベルは必要ありません)
  • Labeledbreak loop;は、ループを終了するために使用されますdefault:(ここではラベル必要です。それ以外の場合はswitch break

breakしたがって、 /というラベルcontinueはネストされたループの外部でも使用できます。switchaがループ内にネストされている場合に使用できます。より一般的には、複数のbreak/ターゲットが存在する可能性があり、 /ステートメントcontinueをすぐに囲まないものを選択する場合に使用されます。breakcontinue


別の例を次に示します。

    morningRoutine: {
        phase1: eatBreakfast();
        if (grumpy) break morningRoutine;
        phase2: kissWife();
        phase3: hugChildren();
    }
    http://stackoverflow.com is the best website ever!

これは、ラベルbreakが反復ステートメント内ではなく、単純なブロックステートメント内で使用されている別のケースです。ラベルは読みやすさを向上させると主張する人もいるかもしれません。この点は主観的です。

いいえ、最後の行ではコンパイル時エラーは発生しません。これは、実際にはJavaパズル22:URLの複製に触発されています。残念ながら、パズルはラベル付けされたステートメントの「適切な」使用にさらに深く入り込むことはありません。

于 2010-04-26T02:30:06.537 に答える
6

はい、 Javabreakcontinueのラベル付きステートメントの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ステートメントを含め、内側と外側の両方のループの残りの部分をスキップしています。

于 2010-04-25T23:54:08.897 に答える
3
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;
            }
        }
    }
于 2010-04-25T23:49:57.977 に答える