"loop:" в коде Java. Что это, зачем он компилируется?

Этот код просто заставил меня взглянуть на мой экран в течение нескольких минут:

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

(строка 137 здесь)

Я никогда раньше этого не видел, и я понятия не имел, что у Java есть ключевое слово цикла (Netbeans даже не окрашивает его как ключевое слово), и он отлично компилируется с помощью JDK 6.

Может кто-нибудь объяснить это мне?

Ответ 1

Это не 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;
            }
        }
    }

Документация.

Ответ 2

Как говорили другие плакаты, это ярлык, а не ключевое слово. Использование меток позволяет делать такие вещи, как

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

Это позволяет нарушить внешний цикл.

EDIT: ссылка на документацию

Ответ 3

Ответ на вопрос, но в качестве примечания:

Я слышал о вопросах интервью a la "Почему этот код Java действителен" (лишенный более простой пример, здесь более средний, спасибо Tim Büthe):

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

Вы все знаете, что этот код (кроме ужасного)?

Решение: две метки, url и http, комментарий www.myserver.com/myfile.mp3 и вызов метода с параметром с таким же именем (url) в качестве метки. Yup, это компилируется (если вы определяете вызов метода и локальную переменную в другом месте).

Ответ 4

Это не ключевое слово, это метка. Он предназначен для использования с ключевыми словами break и continue внутри вложенных циклов:

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

Ответ 5

Это не ключевое слово, а label.

Это позволяет перейти к помеченному разрыву и помеченному далее.

Ответ 6

Его метка точки прерывания, чтобы вы могли вырваться из заданного цикла, а не просто самый внутренний, в котором вы оказались.

Используется на строке 148

Ответ 7

Это действительно ответ на комментарий seanizer для ответа org.life.java, но я хотел ввести код, поэтому я не мог использовать функцию комментария.

В то время как очень редко я нахожу использование "метки разрыва", это происходит случайно. Самый распространенный случай - когда я ищу что-то, что находится в структуре, требующей поиска вложенного цикла, например:

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

Обычно в таких случаях я выталкиваю все это в подпрограмму, так что при попадании я могу вернуть найденный объект, и если он выпадет в нижней части цикла, я могу вернуть значение null, чтобы указать, что не найдено, или, может быть, бросить исключение. Но это иногда полезно.

Честно говоря, я думаю, что изобретатели Java включили эту функцию, потому что между этим и обработкой исключений они устранили последние два законных использования для GOTO.

Очень позднее дополнение:

Однажды я увидел отличную линию кода. Программист написал:

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

Он на самом деле не сказал "example.com", но наш веб-сайт нашей компании.

Создается впечатление, что в коде есть URL. Он успешно компилируется, как будто он что-то делает. Но... что он делает?

В действительности он ничего не делает. "http:" - это ярлык, который он никогда не упоминает. Затем "//" делает остальную часть строки комментарием.

Ответ 8

Это метка, хотя посмотрите на следующий пример:

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

Когда b>10 поток выполнения переходит во внешний цикл

Ответ 9

Вы можете написать почти все, так как это ярлык... У вас есть пример здесь

Ответ 11

Это не ключевое слово, а ярлык . Если внутри цикла for вы пишете break loop;, вы выходите из этого цикла

Ответ 12

это метка. универсальная метка, используемая в java для переноса потока управления в нужное место, в то время как все ключевые слова, такие как continue, break, имеют определенный набор местоположений.