Именованный break
Корректно завершайте внешние циклы
«Именованный break» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Проблема вложенных циклов
Обычное прерывание завершает только внутренний цикл. Но часто нужно выйти сразу из обоих циклов.
Представьте, что Вы ищете значение в таблице. Найдя его, Вы хотите полностью остановить поиск, а не только внутренний цикл.
Java решает эту задачу с помощью именованного прерывания.
Что такое метка
Метка — это имя, прикреплённое к циклу и сопровождаемое двоеточием.
Например, внешний:, размещённое непосредственно перед циклом с параметром, даёт этому циклу имя «внешний».
Сами по себе метки ничего не делают. Они становятся полезными в сочетании с прерыванием или переходом к следующей итерации.
outer:
for (int i = 0; i < 3; i++) {
// 'outer' is now a name for this loop
}Синтаксис именованного прерывания
Запишите имя метки после ключевого слова прерывания: прервать внешний;
Это указывает Java выйти из цикла с именем внешний, даже если команда находится глубоко во вложенном цикле.
И внутренний, и внешний циклы немедленно останавливаются.
break outer; // exits the loop labeled 'outer'Именованное прерывание в действии
Здесь мы ищем значение в таблице 3x3. Когда находим столбец 2 в строке 2, мы прерываем внешний цикл.
Это одновременно останавливает оба цикла, в отличие от обычного прерывания.
public class Main {
public static void main(String[] args) {
outer:
for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= 3; col++) {
if (row == 2 && col == 2) {
System.out.println("Found at " + row + "," + col);
break outer;
}
}
}
System.out.println("Search over");
}
}Почему всё остановилось
Результатом стали сначала «Найдено в позиции 2,2», а затем «Поиск завершён».
Поскольку мы указали прервать внешний, оба цикла завершились. Строка 3 не обрабатывалась.
После выхода только из внутреннего цикла обычное прерывание продолжило бы выполнение со строкой 3.
Сравнение двух прерываний
Посмотрите на ту же таблицу с обычным прерыванием.
Оно завершает только внутренний цикл, поэтому внешний продолжает проходить по всем строкам.
public class Main {
public static void main(String[] args) {
for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= 3; col++) {
if (row == 2 && col == 2) {
break;
}
System.out.println(row + "," + col);
}
}
}
}Поиск в двумерном массиве
Практический пример — поиск нужного значения в матрице.
После нахождения значения именованное прерывание аккуратно завершает весь поиск.
public class Main {
public static void main(String[] args) {
int[][] grid = {{1, 2}, {3, 9}, {5, 6}};
int target = 9;
search:
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
if (grid[r][c] == target) {
System.out.println("At row " + r + " col " + c);
break search;
}
}
}
}
}Метка должна находиться на цикле
Метка располагается непосредственно перед циклом, который она обозначает. Нельзя выполнить переход к метке, расположенной не на окружающем цикле.
Выбирайте понятные имена, например внешний, строки или поиск, чтобы код читался естественно.
Избегайте расплывчатых имён вроде икс:, скрывающих замысел.
Три уровня вложенности
Метки также работают с тремя и более вложенными циклами.
Здесь именованное прерывание сразу выходит из всех трёх циклов, когда выполняется условие.
public class Main {
public static void main(String[] args) {
done:
for (int a = 1; a <= 2; a++) {
for (int b = 1; b <= 2; b++) {
for (int c = 1; c <= 2; c++) {
if (a + b + c == 4) {
System.out.println(a + "," + b + "," + c);
break done;
}
}
}
}
}
}Когда помогает именованное прерывание
Именованное прерывание особенно полезно, когда нужно сразу после получения результата прекратить несколько циклов.
Оно избавляет от дополнительных логических переменных, например логическая переменная найдено, которые пришлось бы проверять на каждом уровне.
При умеренном использовании оно делает циклы поиска короткими и понятными.
Используйте умеренно
Несмотря на мощь, слишком большое количество меток усложняет чтение кода.
Используйте именованное прерывание главным образом в настоящих вложенных поисках. Для простых циклов обычное прерывание понятнее.
Читабельность всегда важнее.
Быстрая проверка
Определите, что делает именованное прерывание во вложенных циклах.
Итоги
Метка задаёт имя циклу, а прервать метка; завершает этот именованный цикл, выходя из всех вложенных в него циклов.
Это идеально подходит для одновременной остановки целого вложенного поиска. Далее Вы увидите, как метки работают с переходом к следующей итерации.
Часто задаваемые вопросы
Урок «Именованный break» бесплатный?
Да — полный текст урока «Именованный break» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Именованный break»?
Корректно завершайте внешние циклы Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Именованный break»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.