break и continue
До сих пор бегун бегал круги, пока условие не скажет «хватит». Но иногда останавливаться нужно посреди тренировки. Бегун ищет на трибунах друга: увидел его — и сходит с дорожки, бежать дальше незачем. Или на дорожке лужа: бегун срезает остаток круга по газону и сразу начинает следующий.
Цикл, который что-то ищет, тоже должен остановиться, как только нашёл. Инструкция break завершает цикл сразу. Эта программа ищет первое число от 100, которое делится на 13 без остатка:
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;
}
}
}
}Давайте пройдём по итерациям:
- Для
nот100до103остатокn % 13не равен нулю, и цикл идёт дальше. - На
104остаток равен нулю:104— это8 * 13. Программа печатает104. breakзавершает цикл, и числа после104уже не проверяются.
Выход из цикла и пропуск круга
Обе инструкции пишут внутри тела цикла, почти всегда внутри if. Разница в том, что они прерывают: весь цикл или одну итерацию.
break: сойти с дорожки
break завершает весь цикл. Остаток тела и все следующие итерации пропускаются, а выполнение переходит к первой инструкции после цикла. Вы уже встречали break в switch, и там он делал то же самое: выводил наружу.
Без break программа выше проверила бы все числа до 200 и напечатала бы ещё 117, 130 и так далее до 195.
break часто ставят в цикл while (true). Его условие всегда истинно, и выйти из такого цикла можно через break. Эта форма удобна, когда решение о выходе принимают в середине тела:
int n = 1;
while (true) {
n = n * 2;
if (n > 100) {
break;
}
System.out.print(n + " "); // 2 4 8 16 32 64
}Разберём, что здесь происходит:
- Каждая итерация удваивает
n:2,4,8и так далее. - Пока
nне больше100,breakне срабатывает, и программа печатает число. - На
128срабатываетbreak, и до печати дело уже не доходит.
continue: сразу к следующему кругу
continue пропускает только остаток текущей итерации, а цикл продолжается. В for после continue выполняется шаг, а затем проверка условия — всё как после обычного конца тела. Бегун срезает остаток круга, но номер на табло всё равно растёт.
for (int i = 1; i <= 6; i++) {
if (i % 3 == 0) {
continue;
}
System.out.print(i + " "); // 1 2 4 5
}Разберём, что происходит:
- Для
3и6условиеi % 3 == 0истинно, иcontinueпропускает печать. - Остальные числа печатаются:
1 2 4 5. - Цикл доходит до
6, как и безcontinue.
Если заменить continue на break, программа напечатает только 1 2: цикл закончится на i, равной 3.
continue удобен, когда неподходящие значения нужно пропустить, а остальные обработать. На собеседованиях часто показывают цикл с continue и break сразу и спрашивают, что он напечатает.
Частая ошибка
В цикле while инструкция continue стоит раньше, чем изменение переменной:
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выполняется шаг заголовка, а вwhilecontinueможет перепрыгнуть строку, которая меняет переменную. - Из цикла
while (true)выходят черезbreak.