Оператор 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 — это рассматривается в разделе операторы с метками.
Практический пример
Что дальше
Комбинируя циклы for, вы получаете вложенные циклы — основу для работы с сетками, таблицами и двумерными массивами.