Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Хотя слово goto зарезервировано в языке Java, оно там не используется; Java не имеет команды goto. Однако существует механизм, чем-то похожий на безусловный переход и осуществляемый командами break и continue. Скорее, это способ прервать итерацию цикла, а не передать управление в другую точку программы. Причина его обсуждения вместе с goto состоит в том, что он использует тот же механизм — метки.

Метка представляет собой идентификатор с последующим двоеточием:

label 1•

Единственное место, где в Java метка может оказаться полезной, — прямо перед

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

labell:

внешний-цикл {

внутренний-цикл { //.

break; // 1 // .

continue; // 2 //..

continue labell; // 3 //...

break labell; // 4

В первом случае (1) команда break прерывает выполнение внутреннего цикла, и управление переходит к внешнему циклу. Во втором случае (2) оператор continue передает управление к началу внутреннего цикла. Но в третьем варианте (3) команда continue labell влечет выход из внутреннего и внешнего циклов и возврат к метке labell. Далее выполнение цикла фактически продолжается, но с внешнего цикла. В четвертом случае (4) команда break labell также вызывает переход к метке labell, но на этот раз повторный вход в итерацию не происходит. Это действие останавливает выполнение обоих циклов. Пример использования цикла for с метками:

//: control/LabeledFor.java

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

import static net.mindview.util.Print.*;

public class LabeledFor {

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

outer- // Другие команды недопустимы for(; true ,) { // infinite loop

inner: // Другие команды недопустимы for(; i < 10; i++) {

printC'i = " + i);

if(i == 2) {

print("continue"); continue;

}

if(i == 3) {

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 не страдают этими пороками, потому что их место расположения ограничено и они не могут использоваться для беспорядочной передачи управления. В данном случае от ограничения возможностей функциональность языка только выигрывает.

switch

Команду switch часто называют командой выбора. С помощью конструкции switch осуществляется выбор из нескольких альтернатив, в зависимости от значения целочисленного выражения. Форма команды выглядит так:

switch(целочисленное-выражение) {

case целое-значение1 команда; break; case целое-значение2 : команда; break, case целое-значениеЗ : команда; break; case целое-значение4 • команда; break; case целое-значениеб : команда; break; // ..

default: оператор;

Поделиться:
Популярные книги

Тот самый сантехник. Трилогия

Мазур Степан Александрович
Тот самый сантехник
Приключения:
прочие приключения
5.00
рейтинг книги
Тот самый сантехник. Трилогия

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Новый Рал 10

Северный Лис
10. Рал!
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Новый Рал 10

Господин следователь. Книга пятая

Шалашов Евгений Васильевич
5. Господин следователь
Детективы:
исторические детективы
5.00
рейтинг книги
Господин следователь. Книга пятая

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Законник Российской Империи. Том 3

Ткачев Андрей Юрьевич
3. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 3