W3docs

Оператор continue в Java

Пропуск оставшейся части итерации цикла в Java с помощью оператора continue, включая метки.

continue — это более мягкий вариант break. Там где break говорит полностью остановить цикл, continue говорит пропустить остаток текущей итерации и перейти к следующей. Цикл продолжает работу.

На этой странице рассматривается, как continue возобновляет каждый вид цикла, ловушка с бесконечным циклом в цикле while, использование для фильтрации элементов, когда предпочесть его инвертированному if, а также то, что он влияет только на ближайший вложенный цикл.

Базовое использование

for (int i = 0; i < 5; i++) {
  if (i == 2) {
    continue;
  }
  System.out.println(i);
}

Вывод:

0
1
3
4

Когда i == 2, continue сразу переходит к шагу обновления цикла (i++), пропуская println. Затем цикл снова проверяет своё условие и продолжает при i == 3.

Как циклы возобновляются

Поведение зависит от вида цикла:

  • for — выполняет выражение обновления, затем проверяет условие
  • while — немедленно проверяет условие
  • do/while — немедленно проверяет условие (в конце тела цикла)
  • расширенный for — переходит к следующему элементу

Использование continue в цикле while без продвижения состояния легко приводит к бесконечному циклу:

int i = 0;
while (i < 5) {
  if (i == 2) {
    continue;     // i never advances — infinite loop!
  }
  System.out.println(i);
  i++;
}

Это классическая ошибка. Либо выполните инкремент перед continue, либо используйте цикл for, чтобы шаг обновления выполнялся автоматически.

Фильтрация элементов

Наиболее частое применение continue — «пропустить элементы, которые меня не интересуют»:

int[] nums = {3, 7, 2, 8, 5, 4};

for (int n : nums) {
  if (n % 2 != 0) {
    continue;          // skip odd numbers
  }
  System.out.println(n);
}

Вывод: 2 8 4.

continue против инверсии условия

Зачастую continue можно переписать в виде if, оборачивающего оставшуюся часть тела:

for (int n : nums) {
  if (n % 2 == 0) {
    System.out.println(n);
  }
}

Функционально идентично. Выбор — вопрос стиля:

  • Используйте continue, когда условий пропуска несколько; серия ранних проверок читается лучше, чем глубоко вложенные if.
  • Используйте оборачивающий if, когда условие пропуска простое, а тело цикла короткое.
// continue style — easy to add another skip condition
for (User u : users) {
  if (u == null) continue;
  if (!u.isActive()) continue;
  if (u.isBanned()) continue;
  process(u);
}

continue пропускает только один уровень

Как и break, continue затрагивает ближайший охватывающий цикл:

for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    if (j == 1) continue;     // only skips inner iteration
    System.out.println(i + "," + j);
  }
}

Вывод:

0,0
0,2
1,0
1,2
2,0
2,2

Чтобы выполнить continue для внешнего цикла из внутреннего, используйте метку continue — это рассматривается в разделе операторы с метками.

Практический пример

java— editable, runs on the server

Что дальше

Комбинируя циклы for, вы получаете вложенные циклы — основу для работы с сетками, таблицами и двумерными массивами.

Практика

Практика
Что выведет этот цикл? for (int i = 0; i < 5; i++) { if (i == 2) continue; System.out.print(i); }
Что выведет этот цикл? for (int i = 0; i < 5; i++) { if (i == 2) continue; System.out.print(i); }
Was this page helpful?