Оператор break в Java
Досрочный выход из циклов и блоков switch в Java с помощью оператора break, включая именованный break.
break — это аварийный выход. Он немедленно прерывает выполнение ближайшего цикла или блока switch, внутри которого находится, и выполнение продолжается с кода, следующего за ними. Используйте его, когда задача цикла выполнена и нет смысла продолжать итерации.
Выход из цикла
for (int i = 0; i < 100; i++) {
if (i == 5) {
break;
}
System.out.println(i);
}
// continues hereВыводит 0 1 2 3 4 и завершается. Условие цикла (i < 100) и обновление (i++) перестают работать в момент выполнения break.
Типичный пример использования: поиск элемента с остановкой сразу после его нахождения:
int[] nums = {3, 7, 2, 8, 5};
int target = 8;
int foundAt = -1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
foundAt = i;
break;
}
}
System.out.println("found at index: " + foundAt);Без break вы продолжали бы проверять элементы, которые заведомо не являются искомыми.
break в while
Работает точно так же в while и do/while:
int n = 1;
while (true) {
if (n > 1000) {
break;
}
n *= 2;
}
System.out.println(n); // 1024while (true) { ... break; } — стандартный шаблон для «цикла до наступления условия, определяемого внутри тела».
break в switch
В традиционном операторе switch оператор break выходит из блока switch, предотвращая проваливание в следующий case. Вы видели это в главе о switch:
switch (cmd) {
case "start": startServer(); break;
case "stop": stopServer(); break;
default: help(); break;
}Стрелочные switch-выражения, рассмотренные в switch expressions, не проваливаются, поэтому им break не нужен.
Блок switch, вложенный внутрь цикла, — классическая ловушка: break, написанный для цикла, на самом деле выходит из switch и позволяет циклу продолжать выполнение. break всегда нацелен на ближайший цикл или switch, который непосредственно его окружает.
for (String cmd : commands) {
switch (cmd) {
case "quit":
break; // exits the switch, NOT the for loop — the loop keeps going
default:
process(cmd);
}
}Чтобы выйти из цикла изнутри switch, нужен именованный break (описан ниже) или флаг, который цикл проверяет после.
break выходит только на один уровень
break выходит из ближайшего охватывающего цикла или switch. Во вложенных циклах он покидает только внутренний:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) break; // only exits the inner loop
System.out.println(i + "," + j);
}
}Вывод:
0,0
1,0
2,0Чтобы выйти из всех вложенных циклов сразу, используйте именованный break — подробнее в именованных операторах:
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) break outer;
System.out.println(i + "," + j);
}
}break vs return
Если после цикла есть важный код, используйте break. Если методу нечего делать после завершения цикла, просто return напрямую:
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
return i; // shorter than break + return after the loop
}
}
return -1;Оба варианта корректны. return зачастую является более чистым выбором для методов поиска.
Рабочий пример
Что дальше
break полностью выходит из цикла. Чтобы пропустить только текущую итерацию и продолжить со следующей, используйте continue.