Несмотря на то что создатели Java сохранили зарезервированное слово goto, они решили не включать его в состав языка. В принципе применение операторов goto считается признаком плохого стиля программирования. Некоторые программисты считают, что борьба с использованием оператора goto ведется недостаточно активно (см., например, известную статью Дональда Кнута "Структурное программирование с помощью операторов goto" (Structured Programming with goto statements; http: / / pplab. snu.ac. kr/courses/advj?105/papers/p261-knuth.pdf)). Они считают, что применение операторов goto может приводить к ошибкам. Но в некоторых случаях нужно выполнять преждевременный выход из цикла. Создатели Java согласились с их аргументами и даже добавили в язык новый оператор для поддержки такого стиля программирования. Им стал оператор break с меткой.
Рассмотрим обычный оператор break без метки. Для выхода из цикла можно применять тот же самый оператор break, что и для выхода из оператора switch. Ниже приведен пример применения оператора break без метки.
while (years <= 100) {
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if (balance >= goal) break;
years++;
}
В данном фрагменте кода выход из цикла осуществляется при выполнении одного из двух условий: years > 100 в начале цикла или balance >= goal в теле цикла. Разумеется, то же самое значение переменной years можно было бы вычислить и без применения оператора break, как показано ниже.
while (years <= 100 && balance < goal) {
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if (balance < goal)
years++; '
}
Следует, однако, иметь в виду, что проверка условия balance < goal в данном варианте кода повторяется дважды. Этого позволяет избежать оператор break.
В отличие от С++, в Java поддерживается оператор break с меткой, обеспечивающий выход из вложенных циклов. С его помощью можно организовать прерывание глубоко вложенных циклов при нарушении логики управления программой. А задавать дополнительные условия для проверки каждого вложенного цикла попросту неудобно.
Ниже приведен пример, демонстрирующий применение оператора break с меткой в коде. Следует иметь в виду, что метка должна предшествовать тому внешнему циклу, из которого требуется выйти. Кроме того, метка должна оканчиваться двоеточием.
Scanner in = new Scanner(System.in); int n; read_data:
while (. . .) // Этот цикл помечен меткой {
• • •
for (. . .) // Этот цикл не помечен {
System.out.print("Enter a number >= 0 : "); n = in.nextlnt();
if (n < 0) // условие для прерывания цикла break read_data; // прервать цикл
• • •
}
}
// этот оператор выполняется сразу же после // оператора break с меткой
if (п < 0) // поверить наличие недопустимой ситуации {
// принять меры против недопустимой ситуации
}
else {
// выполнить действия при нормальном ходе выполнения программы
}
Если было введено неверное число, оператор break с меткой выполнит переход в конец помеченного блока. В этом случае необходимо проверить, нормально ли осуществлен выход из цикла, или он произошел в результате выполнения оператора break.
НА ЗАМЕТКУ! Любопытно, что метку можно связать с любым оператором - даже с условным оператором if или блоком, как показано ниже.
метка: { if (условие) break метка; // выход из блока
• • •
}
/ / При выполнении оператора break управление передается в эту точку
Итак, если вам крайне необходим оператор goto, поместите блок, из которого нужно немедленно выйти, непосредственно перед тем местом, куда требуется перейти, и примените оператор break! Естественно, такой способ не рекомендуется применять на практике. Следует также иметь в виду, что подобным способом можно выйти из блока, но невозможно войти в него.
Существует также оператор continue, который, подобно оператору break, прерывает нормальный ход выполнения программы. Оператор continue передает управление в начало текущего вложенного цикла. Ниже приведен характерный пример применения данного оператора.
Scanner in = new Scanner(System.in);
while (sum < goal)
{
System.out.print("Enter a number: "); n = in.nextlnt(); if (n < 0) continue;
sum += n; //не выполняется, если n < 0
}
Если n < 0, то оператор continue выполняет переход в начало цикла, пропуская оставшуюся часть текущего шага цикла. Если же оператор continue применяется в цикле for, он передает управление оператору увеличения счетчика цикла. В качестве примера рассмотрим следующий цикл:
for (count = 1; count <= 100; count++) {
System.out.print("Enter a number, -1 to quit: "); n = in.nextlnt(); if (n < 0) continue;
sum += n; //не выполняется, если n < 0
}
Если n < 0, то оператор continue осуществит переход к оператору count++. В Java имеется также оператор continue с меткой, передающий управление заголовку оператора цикла, помеченного соответствующей меткой.
Работая программистом часто нужно не спать ночами и писать код, тогда вам поможет http://coffee911.com.ua/koffee/kofe-v-zernah.html кофе в зернах.
СОВЕТ. Многие программирующие на Java считают, что операторы break и continue неоправ-данно усложняют текст программы. Применять эти операторы совсем не обязательно, поскольку те же самые действия можно реализовать, не прибегая к ним. В данной книге операторы break и continue не употребляются нигде, кроме примеров кода, приведенных в этом разделе. |