W3docs

Оператор 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);   // 1024

while (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 зачастую является более чистым выбором для методов поиска.

Рабочий пример

java— editable, runs on the server

Что дальше

break полностью выходит из цикла. Чтобы пропустить только текущую итерацию и продолжить со следующей, используйте continue.

Практика

Практика
Внутри вложенного цикла for обычный оператор break...
Внутри вложенного цикла for обычный оператор break...
Was this page helpful?