Javaコードの「loop:」。これは何ですか?なぜそれがコンパイルされるのですか?


113

このコードにより、画面が数分間見つめられるだけです。

loop:
for (;;) {
    // ...
}

ここの137行目

これまでに見たことがなく、Javaに「ループ」キーワードがある(NetBeansはキーワードのように色付けさえしない)とは思いませんでした。JDK6でうまくコンパイルできます。

説明は何ですか?

回答:


205

それはないkeyword、それはありますlabel

使用法:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

ドキュメンテーション


19
OPはgoto / labelの概念に慣れていない可能性があるため、非常に特殊な状況(たとえば、複数のネストされたループをショートカットする場合)を除いて、これは一般に悪い習慣と見なされることを言及する価値があります。
ヘイレム

10
@haylemは真実ですが、私はさらに進んでいきます。複数のネストされたループも通常は悪い習慣です。ループラベルを使用するときはいつでも、最終的にコードをリファクタリングしたので、それらを必要としませんでした。それよりも常に良い方法があります。
ショーンパトリックフロイド

73

他のポスターが言ったように、それはラベルではなく、キーワードです。ラベルを使用すると、次のようなことができます。

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

これにより、外側のループを切断できます。

ドキュメントへのリンク


31

質問は答えられますが、補足として:

「なぜこのJavaコードが有効なのか」という質問を聞いたことがあります。(より単純な例を取り除きました。ここに意味のある例を挙げます。TxBimtheです):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

(ひどいものは別として)このコードが何か知っているでしょうか?

解決策:2つのラベル、urlおよびhttp、コメントと、ラベルとwww.myserver.com/myfile.mp3同じ名前(url)を持つパラメーターを使用したメソッド呼び出し。そう、これはコンパイルされます(メソッド呼び出しとローカル変数を他の場所で定義した場合)。


参考までに、ループは必要ありません。次の行で十分です
TimBüthe10年

思い出していただきありがとうございます。質問にはループがありませんでした。私は自分の回答を編集します(この質問は一度もされていませんが、インタビュアーは私の元同僚でした)
Sean Patrick Floyd

16

それはキーワードではなく、ラベルです。ネストされたループ内でbreakand continueキーワードとともに使用することを意図しています:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

innerラベルはここでは役に立たない、break;十分です
gertas

12
ループを解消する方法が2つある場合はinner、わかりやすくするためにラベルに感謝します。
スティーブジャクソン

1
@gertas:彼はポイントを示しているだけだと思います。しかし、スティーブ・ジャクソンによれば、とにかく自己文書化の目的でそれを言うのは良い考えかもしれません。
ジェイ

5

キーワードではありません。それはだラベル

それはあなたがラベル付きbreakとラベル付きに行くことができますcontinue


4

これは実際にはorg.life.javaの回答に対するseanizerのコメントへの返信ですが、コメント機能を使用できないようにコードを追加したかったのです。

「break label」の使用を見つけることは非常にまれですが、時々起こります。最も一般的なケースは、次のように、ネストされたループを必要とする構造内にあるものを検索する場合です。

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

通常、そのような場合、すべてをサブルーチンにプッシュして、ヒット時に見つかったオブジェクトを返すことができます。ループの最後から抜けた場合は、nullを返し、見つからないことを示すか、例外をスローすることができます。しかし、これは時々役に立ちます。

率直に言って、Javaの発明者がこの機能を組み込んだのは、この機能と例外処理の間に、GOTOの最後の2つの正当な使用法を排除したためです。

非常に遅い補遺:

素晴らしいギャグ行のコードを一度見ました。プログラマーはこう書いている:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

彼は実際には「example.com」ではなく、私たちの会社のWebサイトを言っていました。

コードにURLが含まれているように見えます。それは何かをするように、正常にコンパイルされます。しかし...それは何をしますか?

実際には何もしません。「http:」は、彼が参照することのないラベルです。次に、「//」で行の残りをコメントにします。


4

これはブレークポイントラベルであり、たまたま入った最も内側のループではなく、指定したループから抜け出すことができます。

148行目で使用されています。



2

これはラベルですが、次の例を見てください。

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

b>10実行フローが外側のループに進むとき。



1

キーワードではなく、ラベルです。forループ内の場合はを記述しbreak loop;、そのループを終了します。


0

ラベルです。一般に、Javaで使用されるラベルは、制御フローを目的の場所に転送するために使用されますが、continueやbreakなどのすべてのキーワードには、場所の指定された選択肢があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.