Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Выполнение этого фрагмента кода дает следующий результат:i is 1After block one.i is 2After block two.After block one.i is 3After block three.After block two.After block one.After for.
Рассмотрим подробнее приведенный выше фрагмент кода, чтобы лучше понять, каким образом получается именно такой результат его выполнения. Когда значение переменной i равно 1, условие первого оператора if становится истинным и управление передается в конец блока с меткой one. В результате выводится сообщение "After block one. " (После первого блока). Если значение переменной i равно 2, то успешно завершается проверка условия во втором операторе i f и выполнение программы продолжается с конца блока с меткой two. В результате выводятся по порядку сообщения "After block two." (После второго блока) и "After block one. ". Когда же переменная i принимает значение 3, истинным становится условие в третьем операторе if и управление передается в конец блока с меткой three. В этом случае выводятся все три сообщения: два упомянутых выше, а также сообщение "After block three. " (После третьего блока), а затем еще и сообщение "After for. " (После цикла for).
Обратимся к еще одному примеру. На этот раз оператор break будет использован для выхода за пределы нескольких вложенных циклов. Когда во внутреннем цикле выполняется оператор break, управление передается в конец блока внешнего цикла. Этот блок помечен меткой done. В результате происходит выход из всех трех циклов.// Еще один пример применения оператора break с меткой,class Break5 { public static void main(String args[]) { done: for(int i=0; i<10; i++) { for(int j=0; j<10; j++) { for (int k=0; k<10; k++) { System.out.println(k + " ") ; if(к == 5) break done; // переход по метке done } System.out.println("After k loop"); // не выполнится } System.out.println("After j loop"); // не выполнится } System.out.println("After i loop"); }}
Ниже приведен результат выполнения данного фрагмента кода.012345After i loop
Расположение метки имеет большое значение, особенно когда речь идет о циклах. Рассмотрим в качестве примера следующий фрагмент кода:// Расположение метки имеет большое значение,class Вгеак6 { public static void main(String args[]) { int x=0, y=0; // Здесь метка располагается перед оператором,stopl: for(x=0; х < 5; х++) { for(у = 0; у < 5; у++) { if(у == 2) break stopl; System.out.println("х and у: " + x + " и + у); } } System.out.println(); //А здесь метка располагается непосредственно перед // открывающей фигурной скобкой. for(x=0; х < 5; х++)stop2: { for(у =0; у < 5; у++) { if(у == 2) break stop2; System.out.println("х and у: " + x + " " + у); } } }}
Ниже приведен результат выполнения данного фрагмента кода.х and у: 0 0х and у: 0 1х and у: 0 0х and у: 0 1X and У 1 0X and У 1 1X and У 2 0X and У 2 1X and У 3 0X and У 3 1X and У 4 0X and У 4 1
Ряды вложенных циклов в данном фрагменте кода идентичны за исключением того, что в первом ряду метка находится перед внешним циклом for. В таком случае при выполнении оператора break управление передается в конец всего блока цикла for, а оставшиеся итерации внешнего цикла пропускаются. Во втором ряду метка находится перед открывающей фигурной скобкой кодового блока, определяющего тело внешнего цикла. Поэтому при выполнении оператора break stop2 управление передается в конец тела внешнего цикла for, и далее выполняется очередной его шаг.
Не следует, однако, забывать, что в операторе 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 + " 11 ); }}
Кодовый блок, обозначенный меткой one, не содержит оператор break, и поэтому управление не может быть передано этому блоку.Применение оператора continue
С помощью оператора continue можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры управления циклом. Оператор continue осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным. Таким образом, оператор continue служит своего рода дополнением оператора break. В приведенном ниже примере программы оператор continue используется в качестве вспомогательного средства для вывода четных чисел в пределах от 0 до 100.// Применение оператора continue.class ContDemo { public static void main(String args[]) { int i; // вывести четные числа в пределах от 0 до 100 for(i = 0; i<=100; i++) { if((i%2) != 0) continue; // завершить шаг итерации цикла System.out.println(i); } }}
В данном примере выводятся только четные числа, поскольку при обнаружении нечетного числа шаг итерации цикла завершается преждевременно в обход вызова метода println().
В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле for сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается.
Как и в операторе break, в операторе continue может присутствовать метка, обозначающая тот объемлющий цикл, выполнение которого должно быть продолжено. Ниже приведен пример программы, демонстрирующий применение оператора continue с меткой.// Применить оператор continue с меткой,class ContToLabel { public static void main(String args[]) {outerloop: for(int i=l; i < 10; i++) { System.out.print("nOuter loop pass " + i + ", Inner loop: "); for(int j = 1; j < 10; j++) { if(j == 5) continue outerloop; // продолжить внешний цикл System.out.print (j); } } }}
Выполнение этой программы дает следующий результат:Outer loop pass 1, Inner loop: 1234Outer loop pass 2, Inner loop: 1234Outer loop pass 3, Inner loop: 1234Outer loop pass 4, Inner loop: 1234Outer loop pass 5, Inner loop: 1234Outer loop pass 6, Inner loop: 1234Outer loop pass 7, Inner loop: 1234Outer loop pass 8, Inner loop: 1234Outer loop pass 9, Inner loop: 1234
Как следует из приведенного выше примера, при выполнении оператора continue управление передается внешнему циклу, и оставшиеся итерации внутреннего цикла пропускаются.
В реальных программах оператор continue применяется очень редко. И объясняется это, в частности, богатым набором в Java операторов цикла, удовлетворяющих большую часть потребностей в написании прикладных программ. Но в особых случаях, когда требуется преждевременное прекращение цикла, оператор continue позволяет сделать это, не нарушая структуру кода.
Пример для опробования 3.3.Завершение построения справочной системы Java
В этом проекте предстоит завершить построение справочной системы Java, начатое в предыдущих проектах. Данная версия будет дополнена сведениями о синтаксисе операторов break и continue, а также даст пользователю возможность запрашивать сведения о синтаксисе нескольких операторов. Эта цель достигается путем добавления внешнего цикла, который выполняется до тех пор, пока пользователь не введет с клавиатуры букву q вместо номера пункта меню.
Последовательность действий
Скопируйте файл Help2.java в новый файл Help3.java.
Поместите весь исходный код программы в бесконечный цикл for. Выход из этого цикла будет осуществляться с помощью оператора break, который получит управление тогда, когда пользователь введет с клавиатуры букву q. А поскольку этот цикл включает в себя весь код, то выход из него означает завершение программы.
Измените цикл отображения меню так, как показано ниже.do { System.out.println('1. if"); System.out.println('2. switch"); System.out.println('3. for"); System.out.println('4. while"); System.out.println('5. do-while"); System.out.println('6. break"); System.out.println('7. continuen") System.out.println('Help on:"); System.out.print("Choose one (q to quit): choice = '(char) System.in.read(); do { ignore = (char) System.in.read(); } while(ignore != fn');} while( choice < '1' | choice > '7' & choice != ' q1);Как видите, цикл теперь включает в себя операторы break и continue. Кроме того,буква q воспринимается в нем как допустимый вариант выбора.