Операторы перехода break, continue, return — введение в Java 023 #
С оператором break мы познакомились в шестом уроке во время знакомства с оператором выбора Switch. С помощью break мы выходим из вариантов выбора.
Прерывание цикла #
С помощью break можно выходить из цикла.
public static void searchFor () for (int i = 0; i 20; i++) if (i == 4) break; // выйти из цикла при i равной 4. > System.out.println("Значение i: " + i); > System.out.println("Цикл завершен."); >
Я могу себе представить такой вариант выхода из бесконечных методов или рекурсивных, где через оператор break мы указываем условия выхода.
// Использование break для выхода из while-цикла. import java.util.Scanner; class UserInputSum public static void main(String[] args) double number, sum = 0.0; Scanner input = new Scanner(System.in); while (true) System.out.print("Enter a number: "); number = input.nextDouble(); if (number 0.0) break; > sum += number; > System.out.println("Sum = " + sum); > >
В языках постарше Java был оператор goto — перейти к определённой строчке. Break не должен и не может заменить оператор, который в Java не внесли создатели. Но зоны видимости и break позволяют делать интересные вещи:
public class MyBreak static void quarantine(boolean quarantine) // мы создаём зону quarantineZone: if (quarantine) break quarantineZone; // выход из зоны карантина > System.out.println("Мы в картантине"); > > >
Но я буду согласен с вами, если вы скажите, что решить вопрос с карантином можно было бы и через if-else.
Оператор continue #
Оператор continue имеет смысл и стоит использовать только в циклах. С его помощью можно завершить шаг и перейти к следующему кругу.
// Демонстрирует continue. public class MyContinue public static void main(String[] args) for (int i = 0; i 10; i++) System.out.print(i + " "); if (i % 2 == 0) continue; > System.out.println(""); > > > /* Вывод в терминале 0 1 2 3 4 5 6 7 8 9 */
Оператор return #
Return мы знаем из урока номер 12 про методы.
Оператор return используют для выполнения явного выхода из метода. Оператор можно использовать в любом месте метода для возврата управления тому объекту, который вызвал данный метод. Таким образом, return прекращает выполнение метода, в котором он находится.
// Демонстрирует return. public class MyReturn static void quarantine(Boolean quarantine) quarantineZone: if (quarantine) return; // выход из программы > System.out.println("Мы в картантине"); > > >
Как мы видим return можно использовать и в исполняем методе, а не только в возвратном. Не уверен, что эти операторы с завтрашнего дня надо активно использовать, но знать их надо.
Метки #
“quarantineZone:” в предыдущем коде — метка.
Дополнительные ссылки #
- Операции с метками, branching statements
- The Java continue and break Keywords
Домашнее задание #
- Напишите программу, которая выводит на консоль простые числа в промежутке от [2, 100].
Используйте для решения этой задачи оператор “%” (остаток от деления) и циклы. Используйте циклы с метками.
Exit a While Loop in Java
- Exit a while Loop After Completing the Program Execution in Java
- Exit a while Loop by Using break in Java
- Exit a while Loop by Using return in Java
This tutorial introduces how you can exit a while-loop in Java and handle it with some example codes to help you understand the topic further.
The while-loop is one of the Java loops used to iterate or repeat the statements until they meet the specified condition. To exit the while-loop, you can do the following methods:
- Exit after completing the loop normally
- Exit by using the break statement
- Exit by using the return statement
Exit a while Loop After Completing the Program Execution in Java
This method is a simple example where a while-loop exits itself after the specified condition marks as false .
The while-loop repeatedly executes until the specified condition is true and exits if the condition is false . See the example below where we are iterate list elements using the while-loop and have the loop exit when all the elements get traversed.
import java.util.Arrays; import java.util.List; public class SimpleTesting public static void main(String[] args) ListInteger> list = Arrays.asList(new Integer[] 12, 34, 21, 33, 22, 55>); int i = 0; while (i list.size()) System.out.println(list.get(i)); i++; > > >
12 34 21 33 22 55
Exit a while Loop by Using break in Java
This way is another solution where we used a break-statement to exit the loop. The break-statement is used to cut the current execution thread, and control goes outside the loop that leads the loop to exit in between. You can use break to exit the while-loop explicitly. See the example below:
import java.util.Arrays; import java.util.List; public class SimpleTesting public static void main(String[] args) ListInteger> list = Arrays.asList(new Integer[] 12, 34, 21, 33, 22, 55>); int i = 0; while (i list.size()) if (i == 3) break; System.out.println(list.get(i)); i++; > > >
12 34 21
Exit a while Loop by Using return in Java
Java uses a return-statement to return a response to the caller method, and control immediately transfers to the caller by exiting a loop(if it exists). So we can use return to exit the while-loop too. Check the code below to see how we used return .
import java.util.Arrays; import java.util.List; public class SimpleTesting public static void main(String[] args) boolean result = show(); if (result) System.out.println("Loop Exit explicitly"); > else System.out.println("Loop not exit explicitly"); > static boolean show() ListInteger> list = Arrays.asList(new Integer[] 12, 34, 21, 33, 22, 55>); int i = 0; while (i list.size()) if (i == 3) return true; System.out.println(list.get(i)); i++; > return false; > >
12 34 21 Loop Exit explicitly
Related Article — Java Loop
- Use Index With forEach in Java
- Java Do-While Loop With User Input
- Java while Loop With User Input
- Break Out of a for Loop in Java
- Shuffle Deck of Cards in Java
- Break Nested Loops in Java
Выход из бесконечного цикла по нажатию. java
Есть простой бесконечный цикл. Работает без привязки к каким-либо объектам. (awt swing etc.) Нужно просто выйти, если была нажата любая клавиша.
while (true) < System.out.println("Внутри цикла"); // куча всяких операторов // if (была ли нажата клавиша?) break; // если нет, продолжает работать дальше, не ждет нажатия. >
Нет никаких готовых простых решений, без сторонних нативных библиотек и подключения других классов?
Отслеживать
задан 15 мая 2022 в 19:45
65 1 1 серебряный знак 11 11 бронзовых знаков
создать переменную которая по умолчанию true. делать while на основе этой переменной. по нажатию на любую клавишу делать эту переменную false. цикл прервется.
15 мая 2022 в 19:59
if (была ли нажата клавиша?) break; — куда уж проще?
16 мая 2022 в 3:42
Вряд ли в java можно отследить нажатие любой клавиши, без привлечения нативных библиотек. Она всё-таки работает на довольно высоком уровне. Только эрзац-решение — читать каким-либо образом стандартный ввод System.in.
16 мая 2022 в 11:35
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
import java.util.Scanner; public class Main < static boolean check = true; static Scanner scanner = new Scanner(System.in); public static void main(String[] args) < new Thread(() -> < int i = 0; while (check) < System.out.print("Внутри цикла "+i+"\r"); i++; try < Thread.sleep(300); >catch (InterruptedException e) < e.printStackTrace(); >> >).start(); new Thread(() -> < if(scanner.hasNext())< check = false; >>).start(); > >
есть 2 потока, один выводит в консоль текст пока check = true, другой — ожидает строку, и когда второй поток видет сообщение он делает check = false из-за чего перестаёт работать while
Отслеживать
ответ дан 16 мая 2022 в 9:09
123 6 6 бронзовых знаков
New thread создает новый поток. Это довольно-таки трудозатратная задача для процессора. Вы уверены, что выбор такого подхода оправдан или стоит пересмотреть его?
16 мая 2022 в 9:44
я уверен что можно и по другому, но это моё решение и оно работает)
16 мая 2022 в 10:20
Похоже, что не работает, и еще шт 10 найденных на sof тоже не работает. )))
16 мая 2022 в 20:35
- java
- while
- break
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Циклы while и for
При написании скриптов зачастую встаёт задача сделать однотипное действие много раз.
Например, вывести товары из списка один за другим. Или просто перебрать все числа от 1 до 10 и для каждого выполнить одинаковый код.
Для многократного повторения одного участка кода предусмотрены циклы.
Циклы for…of и for…in
Небольшое объявление для продвинутых читателей.
В этой статье рассматриваются только базовые циклы: while , do..while и for(..;..;..) .
Если вы пришли к этой статье в поисках других типов циклов, вот указатели:
- См. for…in для перебора свойств объекта.
- См. for…of и Перебираемые объекты для перебора массивов и перебираемых объектов.
В противном случае, продолжайте читать.
Цикл «while»
Цикл while имеет следующий синтаксис:
while (condition) < // код // также называемый "телом цикла" >
Код из тела цикла выполняется, пока условие condition истинно.
Например, цикл ниже выводит i , пока i < 3 :
let i = 0; while (i < 3) < // выводит 0, затем 1, затем 2 alert( i ); i++; >
Одно выполнение тела цикла по-научному называется итерация. Цикл в примере выше совершает три итерации.
Если бы строка i++ отсутствовала в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить «подвисший» скрипт, а JavaScript на стороне сервера придётся «убить» процесс.
Любое выражение или переменная может быть условием цикла, а не только сравнение: условие while вычисляется и преобразуется в логическое значение.
Например, while (i) – более краткий вариант while (i != 0) :
let i = 3; while (i) < // когда i будет равно 0, условие станет ложным, и цикл остановится alert( i ); i--; >
Фигурные скобки не требуются для тела цикла из одной строки
Если тело цикла состоит лишь из одной инструкции, мы можем опустить фигурные скобки :
let i = 3; while (i) alert(i--);
Цикл «do…while»
Проверку условия можно разместить под телом цикла, используя специальный синтаксис do..while :
do < // тело цикла >while (condition);
Цикл сначала выполнит тело, а затем проверит условие condition , и пока его значение равно true , он будет выполняться снова и снова.
let i = 0; do < alert( i ); i++; >while (i < 3);
Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось хотя бы один раз, даже если условие окажется ложным. На практике чаще используется форма с предусловием: while(…) .
Цикл «for»
Более сложный, но при этом самый распространённый цикл — цикл for .
Выглядит он так:
for (начало; условие; шаг) < // . тело цикла . >
Давайте разберёмся, что означает каждая часть, на примере. Цикл ниже выполняет alert(i) для i от 0 до (но не включая) 3 :
for (let i = 0; i < 3; i++) < // выведет 0, затем 1, затем 2 alert(i); >
Рассмотрим конструкцию for подробней:
часть | ||
---|---|---|
начало | let i = 0 | Выполняется один раз при входе в цикл |
условие | i < 3 | Проверяется перед каждой итерацией цикла. Если оно вычислится в false , цикл остановится. |
тело | alert(i) | Выполняется снова и снова, пока условие вычисляется в true . |
шаг | i++ | Выполняется после тела цикла на каждой итерации перед проверкой условия. |
В целом, алгоритм работы цикла выглядит следующим образом:
Выполнить начало → (Если условие == true → Выполнить тело, Выполнить шаг) → (Если условие == true → Выполнить тело, Выполнить шаг) → (Если условие == true → Выполнить тело, Выполнить шаг) → .
То есть, начало выполняется один раз, а затем каждая итерация заключается в проверке условия , после которой выполняется тело и шаг .
Если тема циклов для вас нова, может быть полезным вернуться к примеру выше и воспроизвести его работу на листе бумаги, шаг за шагом.
Вот в точности то, что происходит в нашем случае:
// for (let i = 0; i < 3; i++) alert(i) // Выполнить начало let i = 0; // Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// Если условие == true → Выполнить тело, Выполнить шаг if (i < 3) < alert(i); i++ >// . конец, потому что теперь i == 3
Встроенное объявление переменной
В примере переменная счётчика i была объявлена прямо в цикле. Это так называемое «встроенное» объявление переменной. Такие переменные существуют только внутри цикла.
for (let i = 0; i < 3; i++) < alert(i); // 0, 1, 2 >alert(i); // ошибка, нет такой переменной
Вместо объявления новой переменной мы можем использовать уже существующую:
let i = 0; for (i = 0; i < 3; i++) < // используем существующую переменную alert(i); // 0, 1, 2 >alert(i); // 3, переменная доступна, т.к. была объявлена снаружи цикла
Пропуск частей «for»
Любая часть for может быть пропущена.
Для примера, мы можем пропустить начало если нам ничего не нужно делать перед стартом цикла.
let i = 0; // мы уже имеем объявленную i с присвоенным значением for (; i < 3; i++) < // нет необходимости в "начале" alert( i ); // 0, 1, 2 >
Можно убрать и шаг :
let i = 0; for (; i
Это сделает цикл аналогичным while (i < 3) .
А можно и вообще убрать всё, получив бесконечный цикл:
При этом сами точки с запятой ; обязательно должны присутствовать, иначе будет ошибка синтаксиса.
Прерывание цикла: «break»
Обычно цикл завершается при вычислении условия в false .
Но мы можем выйти из цикла в любой момент с помощью специальной директивы break .
Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт:
let sum = 0; while (true) < let value = +prompt("Введите число", ''); if (!value) break; // (*) sum += value; >alert( 'Сумма: ' + sum );
Директива break в строке (*) полностью прекращает выполнение цикла и передаёт управление на строку за его телом, то есть на alert .
Вообще, сочетание «бесконечный цикл + break » – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале или конце цикла, а посередине или даже в нескольких местах его тела.
Переход к следующей итерации: continue
Директива continue – «облегчённая версия» break . При её выполнении цикл не прерывается, а переходит к следующей итерации (если условие все ещё равно true ).
Её используют, если понятно, что на текущем повторе цикла делать больше нечего.
Например, цикл ниже использует continue , чтобы выводить только нечётные значения:
for (let i = 0; i < 10; i++) < // если true, пропустить оставшуюся часть тела цикла if (i % 2 == 0) continue; alert(i); // 1, затем 3, 5, 7, 9 >
Для чётных значений i , директива continue прекращает выполнение тела цикла и передаёт управление на следующую итерацию for (со следующим числом). Таким образом alert вызывается только для нечётных значений.
Директива continue позволяет избегать вложенности
Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так:
for (let i = 0; i < 10; i++) < if (i % 2) < alert( i ); >>
С технической точки зрения он полностью идентичен. Действительно, вместо continue можно просто завернуть действия в блок if .
Однако мы получили дополнительный уровень вложенности фигурных скобок. Если код внутри if более длинный, то это ухудшает читаемость, в отличие от варианта с continue .
Нельзя использовать break/continue справа от оператора „?“
Обратите внимание, что эти синтаксические конструкции не являются выражениями и не могут быть использованы с тернарным оператором ? . В частности, использование таких директив, как break/continue , вызовет ошибку.
Например, если мы возьмём этот код:
if (i > 5) < alert(i); >else
…и перепишем его, используя вопросительный знак:
(i > 5) ? alert(i) : continue; // continue здесь приведёт к ошибке
…то будет синтаксическая ошибка.
Это ещё один повод не использовать оператор вопросительного знака ? вместо if .
Метки для break/continue
Бывает, нужно выйти одновременно из нескольких уровней цикла сразу.
Например, в коде ниже мы проходимся циклами по i и j , запрашивая с помощью prompt координаты (i, j) с (0,0) до (2,2) :
for (let i = 0; i < 3; i++) < for (let j = 0; j < 3; j++) < let input = prompt(`Значение на координатах ($,$)`, ''); // Что если мы захотим перейти к Готово (ниже) прямо отсюда? > > alert('Готово!');
Нам нужен способ остановить выполнение, если пользователь отменит ввод.
Обычный break после input лишь прервёт внутренний цикл, но этого недостаточно. Достичь желаемого поведения можно с помощью меток.
Метка имеет вид идентификатора с двоеточием перед циклом:
labelName: for (. )
Вызов break в цикле ниже ищет ближайший внешний цикл с такой меткой и переходит в его конец.
outer: for (let i = 0; i < 3; i++) < for (let j = 0; j < 3; j++) < let input = prompt(`Значение на координатах ($,$)`, ''); // если пустая строка или Отмена, то выйти из обоих циклов if (!input) break outer; // (*) // сделать что-нибудь со значениями. > > alert('Готово!');
В примере выше это означает, что вызовом break outer будет разорван внешний цикл до метки с именем outer .
Таким образом управление перейдёт со строки, помеченной (*) , к alert('Готово!') .
Можно размещать метку на отдельной строке:
outer: for (let i = 0; i
Директива continue также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.
Метки не позволяют «прыгнуть» куда угодно
Метки не дают возможности передавать управление в произвольное место кода.
Например, нет возможности сделать следующее:
break label; // не прыгает к метке ниже label: for (. )
Директива break должна находиться внутри блока кода. Технически, подойдет любой маркированный блок кода, например:
label: < // . break label; // работает // . >
…Хотя в 99.9% случаев break используется внутри циклов, как мы видели в примерах выше.
К слову, continue возможно только внутри цикла.
Итого
Мы рассмотрели 3 вида циклов:
- while – Проверяет условие перед каждой итерацией.
- do..while – Проверяет условие после каждой итерации.
- for (;;) – Проверяет условие перед каждой итерацией, есть возможность задать дополнительные настройки.
Чтобы организовать бесконечный цикл, используют конструкцию while (true) . При этом он, как и любой другой цикл, может быть прерван директивой break .
Если на данной итерации цикла делать больше ничего не надо, но полностью прекращать цикл не следует – используют директиву continue .
Обе этих директивы поддерживают метки, которые ставятся перед циклом. Метки – единственный способ для break/continue выйти за пределы текущего цикла, повлиять на выполнение внешнего.
Заметим, что метки не позволяют прыгнуть в произвольное место кода, в JavaScript нет такой возможности.