JavaRush /Java блог /Random UA /Оператори переходу
articles
15 рівень

Оператори переходу

Стаття з групи Random UA
Java підтримує три оператори переходу - break, continueі return. Вони передають керування в іншу частину вашої програми. Розглянемо кожен із операторів докладно. Оператори переходу - 1

Використання оператораbreak

Оператор breakJava використовується в трьох випадках. По-перше, як ви вже бачабо, він закінчує послідовність операторів у гілках оператора 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) він обманює компілятор заради цієї демонстрації. Посилання на першоджерело: Оператори переходу
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ