web-dev-qa-db-ja.com

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

このコードにより、数分間画面を見つめることができました。

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

ここの137行目

私はこれを見たことがなく、Javaには「ループ」キーワードがあり(NetBeansはキーワードのように色付けさえしません)、JDK 6で問題なくコンパイルします。

説明は何ですか?

106
Amy B

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;
            }
        }
    }

ドキュメント

198
Jigar Joshi

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

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

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

ドキュメントへのリンク

73
Rob Di Marco

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

「なぜこれはJavaコードが有効なのか? 』(簡単な例は取り除いた。ここに、卑劣なもの、TimBütheがある)についてのインタビューの質問を聞いたことがあります。

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

(ひどいことは別として)このコードが何であるか知っていますか?

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

31

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

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

キーワードではありません。 ラベル です。

ラベル付きbreakおよびラベル付きcontinueに移動できます。

5
codaddict

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

行148 で使用されます。

4
PaulJWilliams

これは本当に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」とは言いませんでしたが、当社のウェブサイトです。

コードにURLがあるという印象を与えます。それは何かをするように、正常にコンパイルします。しかし...それは何をしますか?

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

4
Jay

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

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

いつ b>10実行フローは外側のループに進みます。

2

ラベルなので、ほとんど何でも書くことができます...例があります here

2
SoulWanderer

これはラベルであり、Java=のラベルは、ループの追加制御のためにbreakおよびcontinueキーワードとともに使用できます。

ここではかなり良い方法で説明されています:

Javaで考える、中断して続行

1
vstoyanov

キーワードではなく、ラベルです。 forループ内にbreak loop;、およびそのループを終了します。

1
greuze

ラベルです。一般に、Javaで使用されるラベルは、継続および中断などのすべてのキーワードが指定された場所の選択を持ちながら、希望の場所で制御フローを転送します。

0
RTA