"Loop:" в коді Java. Що це таке, і чому він складається?


113

Цей код лише змусив мене кілька хвилин дивитися на екран:

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

( рядок 137 тут )

Я ніколи цього не бачив, і я не мав уявлення, що у Java є ключове слово "петля" (NetBeans навіть не забарвлює його як ключове слово), і це добре компілюється з JDK 6.

Яке пояснення?

Відповіді:


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
Варто згадати, оскільки ОП може не бути знайомим з концепцією goto / label, що це, як правило, вважається поганою практикою, за винятком дуже специфічних ситуацій (наприклад, для скорочення кількох вкладених циклів).
haylem

10
@haylem правда, але я б пішов далі: кілька вкладених циклів зазвичай теж є поганою практикою. Щоразу, коли я використовував мітки циклу, я врешті реставрував код, щоб мені не потрібен. Завжди є кращий спосіб, ніж цей.
Шон Патрік Флойд


31

На питання відповіли, але в якості побічної записки:

Я чув про питання інтерв'ю а-ля "Чому цей код Java дійсний?" (викреслив простіший приклад; ось найгірший, Тим Бют):

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

Чи знаєте ви всі, що таке код (крім жахливого)?

Рішення: дві мітки, urlа http, коментар www.myserver.com/myfile.mp3та виклик методу з параметром, який має те саме ім'я ( url), що і мітка. Так, це компілюється (якщо визначити виклик методу та локальну змінну в іншому місці).


FYI вам не потрібна петля, a; у наступному рядку достатньо
Тім Бют

Дякую, що нагадали, я думаю, що в запитанні не було певних циклів. Я відредагую свою відповідь (мені цього питання ніколи не задавали, але інтерв'юер був колишнім моїм колегою)
Шон Патрік Флойд

16

Це не ключове слово, це мітка. Він призначений для використання з ключовими словами breakта continueвсередині вкладених циклів:

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

innerлейбла тут марно, break;достатньо
gertas

12
Якщо є два способи розірвати цикл, я оцінюю innerярлик за ясність.
Стів Джексон

1
@gertas: Я думаю, що він просто демонструє точку. Але для Стіва Джексона, все-таки, було б корисно сказати це для цілей самодокументації.
Джей


4

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

Хоча я дуже рідко зустрічаю слово "break label", але це трапляється випадково. Найпоширеніший випадок, коли я шукаю те, що знаходиться в структурі, що вимагає вкладеного циклу для пошуку, наприклад:

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

Зазвичай у таких випадках я пересуваю все в підпрограму, щоб під час потрапляння я міг повернути знайдений об’єкт, і якщо він випаде внизу циклу, я можу повернути нуль, щоб вказати не знайдений, або, можливо, кинув виняток. Але це час від часу корисно.

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

Дуже пізнє доповнення:

Я бачив один раз чудовий рядок коду. Програміст написав:

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

Він насправді не сказав "example.com", але веб-сайт нашої компанії.

Створюється враження, що в коді є 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 для передачі потоку управління в потрібне місце, тоді як усі ключові слова, такі як продовження та розрив, мають вказаний вибір місця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.