Изучаем Java

Вы здесь: Главная >> Java-учебник >> Многовариантное ветвление в Java и оператор switch

Многовариантное ветвление в Java и оператор switch


Многовариантное ветвление — оператор switch

Конструкция if/else может оказаться неудобной, если вы стоите перед необходимостью сделать выбор из многих вариантов. В языке Java есть оператор switch, эквивалентный оператору switch из языков С и С++.

Например, создавая систему меню, состоящую из четырех альтернатив, как показано на рис. 3.13, можно использовать следующий код.

String Input = JOptionPane.showInputDialog
("Выберите вариант (1, 2, 3, 4)");
int choice = Integer.parselnt(input);
switch (choice)
{
case 1:

break;
case 2:

break;
case 3:

break;
case 4:

break;
default:
// Неверный выбор.

break;
}

Выполнение начинается с метки case, соответствующей значению переменной choice, и продолжается до следующего оператора break или конца оператора switch. Если ни одна метка не совпадает со значением переменной, выполняется раздел default, если он предусмотрен.

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

String input = . . . ;
switch (input) // ОШИБКА
{
case 'A': // (ОШИБКА

break;

}

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


Рис. 3.13. Блок-схема оператора switch

Прерывание потока управления

Несмотря на то что разработчики языка Java сохранили зарезервированное слово goto, они решили не включать его в язык. В принципе, применение операторов goto считается признаком плохого стиля программирования.

Некоторые программисты считают, что борьба с использованием оператора goto ведется недостаточно активно (см., например, знаменитую статью Дональда Кнута "Структурное программирование с использованием операторов goto" (Donald Knuth,"Structured Programming with goto's"). Они считают, что неограниченное применение операторов goto может приводить к ошибкам, однако в некоторых случаях нужно выполнять преждевременный выход из цикла.

Создатели языка Java согласились с их аргументами и даже добавили в язык новый оператор для поддержки такого стиля программирования— оператор break с меткой.

Рассмотрим сначала оператор break без метки. Для выхода из цикла можно применять тот же оператор, что использовался для выхода из тела оператора switch.
Например, так.

while (years <= 100)
{
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if(balance >= goal) break;
years++;
}

Теперь выход из цикла выполняется при двух условиях - если в начале цикла years > 100, либо внутри цикла balance >= goal. Разумеется, то же значение можно было бы вычислить и без применения оператора 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 с меткой. Заметим, что метка должна предшествовать самому внешнему циклу, из которого требуется выйти. За меткой нужно поставить двоеточие.

int n;
read_data:
while (...) // Этот цикл помечен.
{

for (...) // Этот внутренний цикл не помечен.
{
String input
= JOptionPane.showInputDialog("Введите число >= 0");
n = Integer.parseInt(input);
if (n < 0) // Если это условие никогда не выполнится, то мы никогда не выйдем из цикла, break readdata;
// Выход из цикла с меткой read_data.

}
}
// Этот оператор выполняется сразу после оператора break.
if (n < 0) // Проверка исключительной ситуации.
// Обработка исключительной ситуации.
}
else
{
// Возвращение к нормальному выполнению программы.
}

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

Любопытно, что метку можно приписать любому оператору, даже оператору if и составному оператору, например: метка:

{

if {условие) break label; // Выход из блока.

}
// При выполнении оператора break управление передается в эту точку.

Итак, если вам очень нужен оператор goto, и вы можете поместить блок, из которого нужно выйти, непосредственно перед местом, куда вы хотите перейти, можно применить оператор break! Естественно, мы не рекомендуем применять этот способ. Заметим, однако, что таким образом можно выйти из блока, но невозможно войти в него.

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

while (sum < goal)
{
String input = JOptionPane.showlnputDialog("Введите число");
n = integer.ParseInt(input);
if (n < 0) continue;
sum += n; //He выполняется, если n < 0.
}

Если n < 0, то оператор continue выполняет переход к заголовку цикла, пропуская оставшуюся часть текущей итерации.

Если оператор continue используется в цикле for, он передает управление оператору увеличения счетчика цикла.

for (count = 0; count < 100; count ++)
{
String input = JOptionPane . showInputDialog ( "Ввод числа");
n = Integer.parselnt(input);
if (n < 0) continue;
sum += n; // He выполняется, если n < 0.
}

Если n < 0, то оператор continue выполнит переход к оператору count+ + . В языке Java есть также оператор continue с меткой, передающий управление заголовку оператора цикла, помеченного соответствующей меткой.

Многие программисты считают операторы break и continue запутанными. Применять эти операторы вовсе не обязательно — ту же логику можно выразить, не прибегая к ним. В этой книге мы нигде не используем операторы break и continue.


Партнеры сайта