Перейти к содержимому
Теория · Циклы · урок 5 из 8

break и continue

До сих пор бегун бегал круги, пока условие не скажет «хватит». Но иногда останавливаться нужно посреди тренировки. Бегун ищет на трибунах друга: увидел его — и сходит с дорожки, бежать дальше незачем. Или на дорожке лужа: бегун срезает остаток круга по газону и сразу начинает следующий.

Цикл, который что-то ищет, тоже должен остановиться, как только нашёл. Инструкция break завершает цикл сразу. Эта программа ищет первое число от 100, которое делится на 13 без остатка:

JAVA
public class Main {
    public static void main(String[] args) {
        for (int n = 100; n <= 200; n++) {
            if (n % 13 == 0) {
                System.out.println(n); // 104
                break;
            }
        }
    }
}

Давайте пройдём по итерациям:

  1. Для n от 100 до 103 остаток n % 13 не равен нулю, и цикл идёт дальше.
  2. На 104 остаток равен нулю: 104 — это 8 * 13. Программа печатает 104.
  3. break завершает цикл, и числа после 104 уже не проверяются.

Выход из цикла и пропуск круга

Обе инструкции пишут внутри тела цикла, почти всегда внутри if. Разница в том, что они прерывают: весь цикл или одну итерацию.

break: сойти с дорожки

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

Без break программа выше проверила бы все числа до 200 и напечатала бы ещё 117, 130 и так далее до 195.

break часто ставят в цикл while (true). Его условие всегда истинно, и выйти из такого цикла можно через break. Эта форма удобна, когда решение о выходе принимают в середине тела:

JAVA
int n = 1;
while (true) {
    n = n * 2;
    if (n > 100) {
        break;
    }
    System.out.print(n + " "); // 2 4 8 16 32 64
}

Разберём, что здесь происходит:

  1. Каждая итерация удваивает n: 2, 4, 8 и так далее.
  2. Пока n не больше 100, break не срабатывает, и программа печатает число.
  3. На 128 срабатывает break, и до печати дело уже не доходит.

continue: сразу к следующему кругу

continue пропускает только остаток текущей итерации, а цикл продолжается. В for после continue выполняется шаг, а затем проверка условия — всё как после обычного конца тела. Бегун срезает остаток круга, но номер на табло всё равно растёт.

JAVA
for (int i = 1; i <= 6; i++) {
    if (i % 3 == 0) {
        continue;
    }
    System.out.print(i + " "); // 1 2 4 5
}

Разберём, что происходит:

  1. Для 3 и 6 условие i % 3 == 0 истинно, и continue пропускает печать.
  2. Остальные числа печатаются: 1 2 4 5.
  3. Цикл доходит до 6, как и без continue.

Если заменить continue на break, программа напечатает только 1 2: цикл закончится на i, равной 3.

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

Частая ошибка

В цикле while инструкция continue стоит раньше, чем изменение переменной:

JAVA
int i = 0;
while (i < 5) {
    if (i == 2) {
        continue; // ✗
    }
    System.out.print(i + " ");
    i++;
}

Программа печатает 0 1 и зависает. При i, равной 2, continue пропускает остаток тела, а вместе с ним и i++. Значение i не меняется, условие снова истинно, и цикл навсегда застревает на двойке.

Здесь картинка с табло неточна. В for номер на табло увеличивает шаг заголовка, и continue его не пропускает. В while шагом служит обычная строка тела, и continue через неё перепрыгивает. Увеличьте i до continue или перепишите цикл на for.

Главное

  • break сразу завершает весь цикл, и выполнение переходит к инструкции после него.
  • continue пропускает остаток текущей итерации, а цикл продолжается.
  • В for после continue выполняется шаг заголовка, а в while continue может перепрыгнуть строку, которая меняет переменную.
  • Из цикла while (true) выходят через break.