×
Traktatov.net » Философия Java » Читать онлайн
Страница 67 из 395 Настройки

printC'break");

i++; // В противном случае значение i

// не увеличивается break;

}

if(i - 7) {

printC'continue outer");

i++; // В противном случае значение i

// не увеличивается continue outer;

}

if(i == 8) {

printC'break outer"); break outer;

}

for(int k = 0; k < 5; k++) {• if (k == 3) {

printC'continue inner"); continue inner;

}

}

}

}

// Использовать break или continue // с метками здесь не разрешается

}

} /* Output: i = 0

continue inner i = 1

continue inner i = 2 continue i = 3 break i = 4

continue inner i = 5

continue inner i = 6

continue inner i = 7

continue outer i = 8

break outer *///:-

Заметьте, что оператор break завершает цикл for, вследствие этого выражение с инкрементом не выполняется до завершения очередного шага. Поэтому из-за пропуска операции инкремента в цикле переменная непосредственно увеличивается на единицу, когда i — 3. При выполнении условия i == 7 команда continue outer переводит выполнение на начало цикла; инкремент опять пропускается, поэтому и в этом случае переменная увеличивается явно.

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

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

Теперь рассмотрим пример, в котором используются команды break и continue с метками в цикле while:

//: control/LabeledWhile java

// Цикл while с метками

import static net mindview.util.Print.*;

public class LabeledWhile {

public static void main(String[] args) { int i = 0; outer:

while(true) {

print("Внешний цикл while"); while(true) { i++;

printC'i = " + i); if(i == 1) {

print("continue"); continue;

}

if(i == 3) {

print("continue outer"); continue outer;

}

if(i == 5) {

printC'break"); break,

}

if(i == 7) {

printC'break outer"); break outer;

}

}

}

}

} /* Output: Внешний цикл while i = 1 continue i = 2 i = 3

continue outer Внешний цикл while i = 4 i = 5 break

Внешний цикл while i = 6

i = 7

break outer

*///-

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

• Обычная команда continue переводит исполнение к началу текущего внутреннего цикла, программа продолжает работу.

• Команда continue с меткой вызывает переход к метке и повторный вход в цикл, следующий прямо за этой меткой.

• Команда break завершает выполнение текущего цикла.

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

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

В статье Дейкстры особенно критикуются метки, а не сам оператор goto. Дейкстра отмечает, что, как правило, количество ошибок в программе растет с увеличением количества меток в этой программе. Метки затрудняют анализ программного кода. Заметьте, что метки Java не страдают этими пороками, потому что их место расположения ограничено и они не могут использоваться для беспорядочной передачи управления. В данном случае от ограничения возможностей функциональность языка только выигрывает.