Философия Java


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


//...

continue; // 2

//...

continue label1; // 3

//...

break label1; // 4

} }

В случае 1, break прерывает внутреннюю итерацию и вы выходите во внешнюю итерацию. В случие 2, continue перемещает к началу внутренней итерации. Но в случае 3, continue label1 прерывает внутреннюю итерацию и внешнюю итерацию, все пути ведут к label1. Затем фактически продолжаются итерации, но начиная со внешней итерации. В случае 4, break label1 также прерывает все пути к метке label1, но не происходит повторного входа в итерацию. Реально происходит прерывание обеих итераций.

Вот пример использования цикла for:

//: c03:LabeledFor.java

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

public class LabeledFor { public static void main(String[] args) { int i = 0; outer: // Здесь не может быть инструкций

for(; true ;) { // бесконечный цикл

inner: // Здесь не может быть инструкций

for(; i < 10; i++) { prt("i = " + i); if(i == 2) { prt("continue"); continue; } if(i == 3) { prt("break"); i++; // В противном случае i никогда

// не получит инкремент.

break; } if(i == 7) { prt("continue outer"); i++; // В противном случае i никогда

// не получит инкремент.

continue outer; } if(i == 8) { prt("break outer"); break outer; } for(int k = 0; k < 5; k++) { if(k == 3) { prt("continue inner"); continue inner; } } } } // Здесь нельзя использовать break или continue

// с меткой

} static void prt(String s) { System.out.println(s); } } ///:~

Здесь используется метод prt( ), который был использован в других примерах.

Обратите внимание, что break прерывает цикл for, и при этом не происходит инкрементации, пока не будет завершен проход цикла for. Так как break пропускает выражение инкремента, инкремент выполняется прямо в случае i == 3. Инструкция continue outer в случае i == 7 также переходит к началу цикла и также пропускает инкремент, так что нужно инкрементировать в ручную.

Вот результат работы:

i = 0 continue inner i = 1 continue inner i = 2 continue




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