Обратимся к еще одному примеру. На этот раз оператор break будет использован для выхода за пределы нескольких вложенных циклов. Когда во внутреннем цикле выполняется оператор break, управление передается в конец блока внешнего цикла. Этот блок помечен меткой done. В результате происходит выход из всех трех циклов. // Еще один пример применения оператора break с меткой, class Break5 { public static void main(String args[]) { done: for(int i=0; i<10; i++) { for(int j=0; j<10; j++) { for (int k=0; k<10; k++) { System.out.println(k + " ") ; if(к == 5) break done; // переход по метке done } System.out.println("After k loop"); // не выполнится } System.out.println("After j loop"); // не выполнится } System.out.println("After i loop"); } }
Ниже приведен результат выполнения данного фрагмента кода. 0 1 2 3 4 5 After i loop
Расположение метки имеет большое значение, особенно когда речь идет о циклах. Рассмотрим в качестве примера следующий фрагмент кода: // Расположение метки имеет большое значение, class Вгеак6 { public static void main(String args[]) { int x=0, y=0; // Здесь метка располагается перед оператором, stopl: for(x=0; х < 5; х++) { for(у = 0; у < 5; у++) { if(у == 2) break stopl; System.out.println("х and у: " + x + " и + у); } } System.out.println; //А здесь метка располагается непосредственно перед // открывающей фигурной скобкой. for(x=0; х < 5; х++) stop2: { for(у =0; у < 5; у++) { if(у == 2) break stop2; System.out.println("х and у: " + x + " " + у); } } } }
Ниже приведен результат выполнения данного фрагмента кода. х and у: 0 0 х and у: 0 1 х and у: 0 0 х and у: 0 1 X and У 1 0 X and У 1 1 X and У 2 0 X and У 2 1 X and У 3 0 X and У 3 1 X and У 4 0 X and У 4 1
Ряды вложенных циклов в данном фрагменте кода идентичны за исключением того, что в первом ряду метка находится перед внешним циклом for. В таком случае при выполнении оператора break управление передается в конец всего блока цикла for, а оставшиеся итерации внешнего цикла пропускаются. Во втором ряду метка находится перед открывающей фигурной скобкой кодового блока, определяющего тело внешнего цикла. Поэтому при выполнении оператора break stop2 управление передается в конец тела внешнего цикла for, и далее выполняется очередной его шаг.
Не следует, однако, забывать, что в операторе break нельзя использовать метку, не определенную в объемлющем его цикле. Например, приведенный ниже фрагмент кода некорректен и не подлежит компиляции. // Этот фрагмент кода содержит ошибку, class BreakErr { public static void main(String args[]) { one: for(int i=0; i<3; i++) { System.out.print("Pass " + i + ” : ") ; } for(int j=0; j<100; j++) { if(j == 10) break one; // НЕВЕРНО! System, out .print (j + " 11 ); } }
Кодовый блок, обозначенный меткой one, не содержит оператор break, и поэтому управление не может быть передано этому блоку. Применение оператора continue
С помощью оператора continue можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры управления циклом. Оператор continue осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным. Таким образом, оператор continue служит своего рода дополнением оператора break. В приведенном ниже примере программы оператор continue используется в качестве вспомогательного средства для вывода четных чисел в пределах от 0 до 100. // Применение оператора continue. class ContDemo { public static void main(String args[]) { int i; // вывести четные числа в пределах от 0 до 100 for(i = 0; i<=100; i++) { if((i%2) != 0) continue; // завершить шаг итерации цикла System.out.println(i); } } }
В данном примере выводятся только четные числа, поскольку при обнаружении нечетного числа шаг итерации цикла завершается преждевременно в обход вызова метода println.
В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле for сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается.