JLS , раздел 14.16 , говорит о выражении continue
:
Цель продолжения должна быть while
, do
или for
или во время компиляции.
Достаточно просто, но давайте посмотрим на грамматику для помеченного оператора ( Раздел 14.7 ).
LabeledStatement:
Идентификатор: оператор
Он может содержать другие операторы в целом, которые, в свою очередь, могут быть while
, do
или for
("wdf ") или другое помеченное утверждение (раздел 14.5) (или другие виды утверждений).
Но сам по себе ярлык не является утверждением;ему нужен другой оператор как часть самого себя.
Далее, вложенные помеченные операторы допускаются , поэтому в общем случае вы можете сделать что-то вроде:
A: B: yourStatementHere;
Вы можетевложите его дальше, если хотите:
A: B: C: D: E: F: G: yourStatementHere;
Однако с
A: B: while (true) continue A;
Утверждение, что A:
метка другое помеченное выражение, а не "wdf"заявление, даже если само B:
помеченное заявление содержит a while
заявление.
Если вы наденете свою адвокатскую шляпу, вы можете утверждать, что приведенное выше предложение о continue
оператор, который должен ссылаться на оператор "wdf", ничего не говорит о том, что оператор "wdf" вложен в помеченный оператор, поэтому это должна быть ошибка компилятора.
Это кажется мне очень разборчивым;возможно, в JLS должен был быть пункт, указывающий, что выражение «wdf» может быть само вложено в помеченный оператор.
Но до тех пор, пока это не произойдет, это будет правильным, хотя и непреднамеренным, следствием формулировкиJLS предоставляет, как указано выше.
Так почему break
разрешено делать это?
A: B: while (true) break A; // no error
В разделе 14.15 JLS нет соответствующей строки,который говорит об операторе break
, который обеспечивает, что целью оператора break
должен быть оператор "wdf".Оператор break
должен по-прежнему находиться внутри оператора "wdf" (или оператора switch
), но нет соответствующего требования, чтобы его метка ссылалась на оператор определенного типа.