Использование оператора break

В Java оператор break находит три применения. Во-первых, как уже было показано, он завершает последовательность операторов в операторе switch. Во-вторых, его можно использовать для выхода из цикла. И, в-третьих, его можно использовать в качестве "цивилизованной" формы оператора безусловного перехода ("goto"). Рассмотрим последние два применения.

Использование оператора break дли выхода из цикла

Используя оператор break, можно вызвать немедленное завершение цикла, пропуская условное выражение и любой остальной код в теле цикла. Когда программа встречает оператор break внутри цикла, она прекращает выполнение цикла, и управление передается оператору, следующему за циклом. Ниже показан простой пример.

// Использование оператора break для выхода из цикла.
class BreakLoop {
public static void main(String args[]) {
for(int i=0; i<100; i++) {
if(i == 10) break; // выход из цикла если i равно 10
System.out.println("i : " + i);
}
System.out.println("Цикл завершен.");
}
}

Эта программа генерирует следующий вывод:

i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Цикл завершен.

Как видите, хотя цикл for должен был бы выполняться для значений управляющей переменной от 0 до 99, оператор break приводит к более раннему выходу из него, когда значение переменной i становится равным 10.

Оператор break можно использовать в любых циклах Java, в том числе в преднамеренно бесконечных циклах. Например, в предыдущей программе можно было применить цикл while. Эта программа генерирует вывод, совпадающий с предыдущим.

// Использование оператора break для выхода из цикла while.
class BreakLoop2 {
public static void main(String args[]) {
int i = 0;
while (i < 100) {
if(i == 10) break; // выход из цикла, если i равно 10
System.out.println ("i: " + i) ;
i++;
}
System.out.println("Цикл завершен.");
}
}

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

// Использование оператора break во вложенных циклах.
class BreakLoop3 {
public static void main(String args[]) {
for (int i=0; КЗ; 1++) {
System.out.print("Проход " + i + ": ");
for (int j=0; j<100; j++) {
if (j == 10) break; // выход из цикла, если j равно 10
System.out.print (j + " ");
}
System.out.println ();
}
System.out.println("Циклы завершены.");
}
}

Эта программа генерирует следующий вывод:

Проход 0: 0 1 2 3 4 5 6 7 8 9
Проход 1: 0 1 2 3 4 5 6 7 8 9
Проход 2: 0 1 2 3 4 5 6 7 8 9
Циклы завершены.

Как видите, оператор break во внутреннем цикле может приводить к выходу только из этого цикла. На внешний цикл он не оказывает никакого влияния.

При использовании оператора break необходимо помнить следующее. Во-первых, в цикле можно использовать более одного оператора break. Однако при этом следует соблюдать осторожность. Как правило, применение слишком большого числа операторов break приводит к деструктуризации кода. Во-вторых, оператор break, который завершает последовательность операторов в операторе switch, оказывает влияние только на данный оператор switch, а не на какие-либо содержащие его циклы.

Помните! Оператор break не был разработан в качестве обычного средства выхода из цикла. Для этого служит условное выражение цикла. Оператор break следует использовать для выхода из цикла только в определенных особых ситуациях.

Использование оператора break в качестве формы оператора безусловного перехода

Кроме его применения с операторами switch и циклами, оператор break можно использовать и сам по себе в качестве "цивилизованной" формы оператора безусловного перехода ("goto"). Язык Java не содержит оператора "goto", поскольку он позволяет выполнять ветвление программ произвольным и неструктурированным образом. Как правило, код, который управляется оператором "goto", труден для понимания и поддержки. Кроме того, этот оператор исключает возможность оптимизации кода для определенного компилятора. Однако в некоторых случаях оператор "goto" — ценная и вполне допустимая конструкция управления потоком команд. Например, оператор "goto" может быть полезен при выходе из набора вложенных циклов с большим количеством уровней. Для таких ситуаций Java определяет расширенную форму оператора break. Используя эту форму, можно, например, осуществлять выход из одного или нескольких блоков кода. Эти блоки не обязательно должны быть частью цикла или оператора switch. Они могут быть любым блоком. Более того, можно точно указать оператор, с которого будет продолжено выполнение программы, поскольку эта форма оператора break работает с метками. Как будет показано, оператор break предоставляет все преимущества оператора "goto", не порождая его проблемы. Общая форма оператора break с меткой имеет следующий вид:

break метка;

Чаще всего, метка — это имя метки, идентифицирующей блок кода. Им может быть как самостоятельный блок кода, так и целевой блок другого оператора. При выполнении этой формы оператора break управление передается названному блоку кода. Помеченный блок кода должен содержать оператор break, но он не обязательно должен быть непосредственно содержащим его блоком. В частности это означает, что оператор break с меткой можно применять для выхода из набора вложенных блоков. Однако его нельзя использовать для передачи управления внешнему блоку кода, который не содержит данный оператор break.

Чтобы пометить блок, необходимо поместить метку в его начале. Метка — это любой допустимый идентификатор Java, за которым следует двоеточие. Как только блок помечен, его метку можно использовать в качестве цели оператора break. В результате выполнение программы будет продолжено с конца помеченного блока. Например, следующая программа содержит три вложенных блока, каждый из которых помечен своей меткой. Оператор break приводит к переходу к концу блока с меткой second с пропуском двух операторов println ().

// Использование оператора break в качестве цивилизованной формы оператора goto.
class Break {
public static void main(String args[]) {
boolean t = true;
first: {
second: {
third: {
System.out.println("Предшествует оператору break.");
if(t) break second; // выход из блока second
System.out.println("Этот оператор не будет выполняться");
}
System.out.println("Этот оператор не будет выполняться");
}
System.out.println("Этот оператор следует за блоком second.");
}
}
}

Эта программа генерирует следующий вывод:

Предшествует оператору break.
Этот оператор следует за блоком second.

Одно из наиболее распространенных применений оператора break с меткой — его использование для выхода из вложенных циклов. Например, в следующей программе внешний цикл выполняется только один раз:

// Использование оператора break для выхода из вложенных циклов. class BreakLoop4 {
public static void main(String args[]) {
outer: for(int i=0; i<3; i++) {
System.out.print("Проход " + i + ": ");
for(int j=0; j<100; j++) {
if (j == 10) break outer; // выход из обоих циклов
System.out.print (j + " ");
}
System.out.println("Эта строка не будет выводиться");
}
System.out.println("Циклы завершены."); }

Эта программа генерирует следующий вывод:

Проход 0: 0123456789 Циклы завершены.

Как видите, когда внутренний цикл выполняет выход во внешний цикл, это приводит к завершению обоих циклов. Следует иметь в виду, что нельзя выполнить переход к какой-либо метке, которая определена не для содержащего данный оператор 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 + " ");
}
}
}

Поскольку блок, помеченный меткой one, не содержит оператор break, передача управления этому внешнему блоку невозможна.




Rambler's Top100