Извините за код фрагмент был удален. Я делю вопрос
(отредактировано для ясности)
Операторы могут иметь префиксы меток ( Идентификатор : Оператор ). Идентификатор объявляется меткой непосредственно содержащегося утверждения .
В отличие от C и C ++, в языке программирования Java нет оператора
goto
; метки операторов идентификатора используются с операторамиbreak
( §14.15 ) илиcontinue
( §14.16 ), появляющимися в любом месте помеченного оператора.
Таким образом, в JLS ясно, что метки используются с break
или continue
, и никакой другой грамматический элемент языка программирования Java не использует их.
Строго говоря, break
и continue
, отмеченные или нет, НИКОГДА не являются необходимыми. Их всегда можно написать вне кода. Однако при идиоматическом использовании они могут привести к более удобочитаемому коду.
Вот наглядный пример: имея int []
, мы хотим:
«One (1)»
на 1
«Два (2)»
на 2
«Ноль»
на 0
немедленно прекратить обработку любого другого номера
int [] arr = {1, 2, 0, 1, -1, 0, 2};
цикл:
for (int num: arr) {
switch (num) {{ {1}} случай 1:
System.out.print ("One");
break;
случай 2:
System.out.print (" Два ");
break;
case 0:
System.out.print (" Zero ");
continue loop;
default:
цикл прерывания;
}
System.out.print ("(" + num + ")");
}
// выводит "Один (1) Два (2) Ноль Один (1)"
Здесь мы видим, что:
разрыв
в переключателе
используется, чтобы избежать «провала» между случаями ;
используется для пропуска постобработки в случае 0:
(метка здесь не требуется) разрыва;
используется для завершения цикла на по умолчанию:
(метка здесь необходима; в противном случае это разрыв переключателя
) Так помечено break
/ continue
также можно использовать вне вложенных циклов; его можно использовать, когда переключатель
вложен в цикл. В более общем смысле, он используется, когда есть потенциально несколько целевых break
/ continue
, и вы хотите выбрать тот, который не включает сразу разрыв
/ оператор continue
.
Вот еще один пример:
morningRoutine: {
phase1: eatBreakfast();
if (grumpy) break morningRoutine;
phase2: kissWife();
phase3: hugChildren();
}
http://stackoverflow.com is the best website ever!
Вот еще один случай, когда помеченный break
используется не в итеративном операторе, а скорее в простом блочном операторе. Кто-то может возразить, что этикетки улучшают читаемость; этот момент субъективен.
И нет, последняя строка НЕ дает ошибки времени компиляции. На самом деле он вдохновлен Java Puzzlers Puzzle 22: Dupe of URL. К сожалению, загадка не заключается в более глубоком «правильном» использовании помеченных утверждений.
Да, break
и continue
- единственные два варианта использования помеченных операторов в Java . (В 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");
Когда вы продолжаете
обратно на внешнюю
метку, вы пропускаете остаток как внутреннего, так и внешнего цикла, включая оператор печати.
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;
}
}
}