Java підтримує три оператори переходу - Використання оператора
Оператор Використання
На додаток до застосування в операторах switch та циклах Використання оператора
Іноді корисно розпочати чергову ітерацію циклу раніше. Тобто потрібно продовжити виконання циклу, але припинити обробку залишку коду в його тілі для цієї приватної ітерації. Насправді це -перехід Оператор
Останній оператор управління -
break
, continue
і return
. Вони передають керування в іншу частину вашої програми. Розглянемо кожен із операторів докладно.
Використання оператораbreak
Оператор break
Java використовується в трьох випадках. По-перше, як ви вже бачабо, він закінчує послідовність операторів у гілках оператора switch
. По-друге, його можна використовувати для виходу із циклу. По-третє, може застосовуватися як " цивілізована " форма оператора безумовного переходу goto
. У цьому розділі пояснюються два останні випадки. Використання break
для виходу з циклу Використовуючи break
, ви можете форсувати негайне завершення циклу, обходячи умовний вираз і будь-який код у тілі циклу. Коли оператор break
зустрічається всередині циклу, другий закінчується і програмне управління передається оператору, що йде за ним. Простий приклад:
// Использование break для выхода из цикла.
public class BreakLoop {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 4) {
break; // завершить цикл, если i = 4
}
System.out.println("i: " + i);
}
System.out.println("Цикл завершен.");
}
}
Ця програма генерує такий висновок:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
Хоча цикл for
розроблений тут для виконання своїх операторів від 0 до 99 разів, оператор break
змушує його завершитись раніше, коли i дорівнює 4. Оператор break
може використовуватися з будь-яким із циклів Java, включаючи навмисно нескінченні цикли. Наприклад, нижче показано попередню програму, закодовану за допомогою циклу while
. Висновок цієї програми такий самий, як у її попередниці.
// Использование break для выхода из while-цикла.
public class BreakLoop2 {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
if (i == 4) {
break; // закончить цикл, если i = 4
}
System.out.println("i: " + i);
i++;
}
System.out.println("Цикл завершен.");
}
}
При використанні всередині набору вкладених циклів оператор break
виходитиме лише з внутрішнього циклу. Наприклад:
// Использование break во вложенных циклах.
public class BreakLoop3 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 10; j++) {
if (j == 4) {
break; // закончить цикл, если j = 4
}
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("Цикл завершен.");
}
}
Ця програма генерує такий висновок:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
Як ви бачите, оператор break
у внутрішньому циклі викликає завершення лише цього циклу. Зовнішній цикл не торкається. Зробимо ще два зауваження щодо break
. По-перше, у циклі може з'явитися кілька операторів break
. Однак будьте обережні. Занадто велика кількість створює тенденцію до деструктуризації вашого коду. По-друге, break
, який завершує оператор switch
, впливає лише даний switch
-оператор (але з включають його цикли). Примітка: Break
не проектувався як нормальний засіб завершення циклу. Цю мету обслуговує умовний вираз заголовка циклу. Оператор break
слід використовувати для переривання циклу лише тоді, коли виникають деякі спеціальні ситуації.
Використання break
як формиgoto
На додаток до застосування в операторах switch та циклах break
можна також використовувати окремо, як "цивілізовану" форму оператора goto
. Java не містить оператора goto
, тому що він виконує перехід довільним та неструктурованим способом. Код, що інтенсивно використовує goto
, зазвичай важко зрозуміти і підтримувати. Він також скасовує деякі оптимізації компілятора. Існує, однак, кілька місць у програмі, де goto
цінна і законна конструкція управління потоком виконання. Наприклад, goto
може бути корисним, коли ви виходите з глибоко вкладеного набору циклів. Щоб обробляти такі ситуації, Java визначає розширену форму оператораbreak
. Використовуючи її, ви можете вийти з одного чи більше блоків коду. Цим блокам не потрібно бути частиною циклу чи оператора switch
. Це може бути будь-який блок. Далі, ви можете визначити точно, де виконання буде продовжено, тому що дана форма break
працює з міткою та забезпечує переваги goto
, минаючи його проблеми. Оператор break
з міткою має таку загальну форму: break label;
Тут label
ім'я мітки, яка ідентифікує деякий блок коду. Коли ця форма break
виконується, керування передається з іменованого блоку коду (чия мітка вказана в операторі break
) на наступний за цим блоком оператор. Позначений блок коду обов'язково має включати даний оператор break
, але не потрібно, щоб це включення було безпосереднім (тобто.break
може включатися не прямо в блок зі своєю міткою, а до вкладеного в нього блок, можливо, теж помічений). Це означає, що ви можете використовувати позначений оператор break
, щоб вийти з набору вкладених блоків. Але ви не можете використовувати break
для передачі управління блоку коду, який не включає оператор break
. Для іменування блоку помістіть мітку на його початку (перед фігурною дужкою, що відкриває блок). Мітка - це будь-який допустимий ідентифікатор Java, за яким слідує двокрапка. Після маркування блоку його мітку можна використовувати як аргумент оператора break
. Це призведе до того, що виконання буде продовжено з кінця блоку. Наприклад, наступна програма містить три вкладені блоки, причому кожен має свою власну мітку. Операторbreak
здійснює перехід вперед, за кінець блоку, маркованого міткою second
, пропускаючи два оператори println()
.
// Использование break як цивабозованной формы goto.
public class Break {
public static void main(String[] args) {
boolean t = true;
first:
{
second:
{
third:
{
System.out.println("Перед оператором break.");
if (t) {
break second; // выход из блока second
}
System.out.println("Данный оператор никогда не выполнится");
}
System.out.println("Данный оператор никогда не выполнится ");
}
System.out.println("Данный оператор размещен после блока second.");
}
}
}
Виконання цієї програми генерує такий висновок:
Перед оператором break.
Данный оператор размещен после блока second.
Одним із найчастіших застосувань позначеного оператора break
є вихід із вкладених циклів. Наприклад, у наступній програмі зовнішній цикл виконується лише один раз:
// Использование break для выхода из вложенных циклов.
public class BreakLoop4 {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 100; j++) {
if (j == 10) {
break outer; // выйти из обоих циклов
}
System.out.print(j + " ");
}
System.out.println("Эта строка никогда не будет выведена");
}
System.out.println("Цикл завершен.");
}
}
Програма генерує наступний висновок:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
Неважко помітити, що при перериванні внутрішнього циклу до кінця зовнішнього закінчуються обидва цикли. Майте на увазі, що ви не можете зробити break
-перехід до будь-якої мітки, яка не визначена для блоку, що включає. Наприклад, наступна програма неприпустима і не компілюватиметься:
// Эта программа содержит ошибку.
public class BreakErr {
public static void main(String[] args) {
one:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
}
for (int j = 0; j < 100; j++) {
if (j == 10) {
break one; //He верно!
}
System.out.print(j + " ");
}
}
}
Так як цикл, позначений як one, не включає оператор break
, передати управління цьому блоку неможливо.
Використання оператораcontinue
Іноді корисно розпочати чергову ітерацію циклу раніше. Тобто потрібно продовжити виконання циклу, але припинити обробку залишку коду в його тілі для цієї приватної ітерації. Насправді це -перехід goto
повз наступні операції тіла в кінець блоку циклу. Таку дію виконує оператор continue
. У циклах while
і do while
оператор continue
викликає передачу управління безпосередньо умовному виразу, що керує циклом. У циклі for
керування переходить спочатку до ітераційної частини оператора for
і потім до умовного виразу. Для всіх трьох циклів будь-який проміжний код коштує. Приклад програми, яка використовує continue
для друку двох чисел на кожному рядку, наведено нижче:
// Демонстрирует continue.
public class Continue {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.print(i + " ");
if (i % 2 == 0) {
continue;
}
System.out.println("");
}
}
}
Цей код використовує операцію %
(залишок за модулем), щоб перевіряти, чи є i
парним. Якщо так, цикл продовжується без друку символу нового рядка (newline). Висновок програми:
0 1
2 3
4 5
6 7
8 9
Як і в операторі break
, continue
можна визначити мітку, що вказує, який включає цикл слід продовжити. Приклад програми, яка використовується continue
для друку трикутної таблиці множення від 0 до 9.
// Использование continue с меткой.
public class ContinueLabel {
public static void main(String[] args) {
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > i) {
System.out.println();
continue outer;
}
System.out.print(" " + (i * j));
}
}
System.out.println();
}
}
Оператор continue
у цьому прикладі завершує цикл, що обчислює j
, і продовжує з наступної ітерації керованого циклу i
. Висновок цієї програми:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
У використанні continue
корисний дуже рідко. Одна з причин цього полягає в тому, що Java забезпечує багатий набір операторів циклу, які влаштовують більшість програм. Однак, для тих спеціальних ситуацій, у яких необхідне дострокове припинення ітерації, оператор continue
забезпечує структурний спосіб виконання цього завдання.
Операторreturn
Останній оператор управління - return
. Він використовується для явного повернення з методу, тобто передає програмне управління назад в програму, що викликає. Оператор return
відносять до категорії операторів переходу. Хоча його повне обговорення має почекати до обговорення методів, тут подано короткий огляд return
. Оператор return
можна використовувати в будь-якому місці методу для виконання переходу назад в програму, що викликає цей метод. Оператор return
негайно закінчує виконання методу, де він перебуває. Це ілюструє такий приклад:
// Демонстрирует return.
public class Return {
public static void main(String[] args) {
boolean t = true;
System.out.println("Перед оператором return.");
if (t) {
return; // возврат в вызывающую программу
}
System.out.println("Этот оператор никогда не выполнится.");
}
}
Тут return
виконує повернення до Java-системи під час виконання, оскільки саме ця система викликає метод main()
. Висновок цієї програми:
Перед оператором return.
Можна помітити, що завершальний оператор println()
не виконується. У момент виконання return
управління передається назад у програму, що викликає. І останнє зауваження. У попередній програмі оператор if
(t) необхідний. Без нього Java-компілятор видав би помилку "недосяжний код", тому що він знав би, що останній оператор println()
ніколи не виконуватиметься. Щоб запобігти зазначеній помилці, якраз і використовується оператор if
(t) він обманює компілятор заради цієї демонстрації. Посилання на першоджерело: Оператори переходу
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ