Я думал, что помеченный разрыв разбивает тело сразу после ярлыка.
Нет. Это нарушает оператор (или блок), к которому прикреплена метка.
Таким образом:
for (int x = 0; x < 5; x++)
stop2: {
// stuff
break stop2;
}
разрывает оператор тела for
l oop, а
stop3: for (int x = 0; x < 5; x++)
{
//stuff
break stop3;
}
- оператор for
.
Сравните вышеприведенное с
for (int x = 0; x < 5; x++)
{
//stuff
break;
}
Обычный (без метки) break
может использоваться только в al oop или в операторе switch, и он разрывает непосредственно включающую l oop или переключатель.
Вот что JLS 14.15 говорит по этому поводу:
"Оператор break
без метки пытается передать управление самой внутренней оболочке switch
, while
, do
или for
оператор непосредственно включающего метода или инициализатора; этот оператор, который называется break target , затем сразу же завершается нормально. "
"Оператор break
с меткой Identifier
пытается передать управление во вложенную помеченную инструкцию (§14.7), которая имеет тот же Identifier
, что и его метка; эта инструкция, которая называется цель прерывания , затем сразу же завершается нормально. В этом случае целью прерывания не обязательно должно быть выражение switch
, while
, do
или for
. "
Таким образом, ключевой момент в определении того, что делает оператор break
(обычный или помеченный), заключается в том, чем является цель break .
Это все немного неясно .. и еще одна веская причина использовать помеченные операторы только тогда, когда они абсолютно необходимы. Я не вижу оправдания их использования в ваших примерах (кроме как в качестве иллюстрации). Один из них должен быть написан как обычный break
, а другой должен быть записан как continue
.
Но (для сомневающихся) оба эти примеры являются допустимым, компилируемым кодом Java и оба имеют четкое значение в соответствии с JLS.