Философия Java


Имеющий дурную славу “goto” - часть 3


i = 3 break

i = 4 continue inner i = 5 continue inner i = 6 continue inner i = 7 continue outer i = 8 break outer

Если не использовать инструкцию break outer, то нет способа выйти во внешний цикл из внутреннего цикла, так как break сам по себе прерывает только самый внутренний цикл. (То же самое верно и для continue.)

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

Вот демонстрация использования помеченных инструкций break и continue с циклом while:

//: c03:LabeledWhile.java

// "Помеченный цикл while" в Java.

public class LabeledWhile { public static void main(String[] args) { int i = 0; outer: while(true) { prt("Outer while loop"); while(true) { i++; prt("i = " + i); if(i == 1) { prt("continue"); continue; } if(i == 3) { prt("continue outer"); continue outer; } if(i == 5) { prt("break"); break; } if(i == 7) { prt("break outer"); break outer; } } } } static void prt(String s) { System.out.println(s); } } ///:~

Те же правила применимы для while:

  1. Обычный continue переводит в начало самого внутреннего цикла и продолжает выполнение.
  2. Помеченный continue переходит к метке и вновь входит в цикл, расположенный сразу за этой меткой.
  3. break “выбрасывает в низ” цикла.
  4. Помеченный break выбрасывает в низ после конца цикла, у которого объявлена метка.

Вывод этого метода становится достаточно ясным:

Outer while loop i = 1 continue

i = 2 i = 3 continue outer Outer while loop i = 4 i = 5 break

Outer while loop i = 6 i = 7 break outer

Важно запомнить, что есть только одна причина использования меток в Java, когда вы имеете группу циклов и вы хотите использовать break или continue через группу, содержащую более одного уровня циклов.

В газетной статье Dijkstra “Goto considered harmful”, то, против чего он действительно возражал - это метки, а не goto. Он заметил, что число ошибок увеличивается с увеличением числа меток в программе. Метки и переходы делают программу трудной для статического анализа, так как это вводит в программу циклы графов исполнения. Обратите внимание, что метки Java не испытывают этой проблемы, так как они ограничены своим местом и не могут быть использованы для передачи управления другим образом. Также интересно заметить, что это тот случай, когда особенности языка становятся более полезными при ограничении инструкции.




Начало  Назад  Вперед



Книжный магазин