JavaRush /Курсы /Java Syntax New Beta /Прерывание цикла

Прерывание цикла

Java Syntax New Beta
4 уровень , 9 лекция
Открыта

Фрагмент лекции JavaRush - университета.


— Привет, Амиго!

— Привет, Элли.

— Ты уже изучал циклы, и это круто.

— Согласен! Вообще теперь не понимаю, как без них обходиться.

— Иногда можно и без них… Но чаще всего не нужно. Сегодня же мы поговорим о ситуации, когда нужно выйти из цикла досрочно.

— То есть когда условие для продолжения цикла выполнено, но выйти нужно?

Именно! Иногда ты звучишь как готовый программист. Так вот, чтобы выйти из цикла досрочно, можно использовать команду break. Посмотри на следующий пример:

Код Пояснение
Scanner console = new Scanner(System.in);
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
Программа будет считывать строки с клавиатуры, пока не будет введена строка exit.

— Вижу. Программа считывает строки с консоли. Если ввести строку exit, переменная isExit станет true, а условие цикла !isExit примет значение false, и цикл завершится.

— Всё верно. Так вот, в Java есть специальный оператор break, который позволяет упростить написание такой логики. Если выполнить команду break внутри цикла, он немедленно завершается: программа начнет выполнять команды, которые идут после цикла. Команда очень лаконична:

break;

— Вот как можно переписать только что разобранный пример с использованием break:

Код Пояснение
Scanner console = new Scanner(System.in);
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
     break;
}
Программа будет считывать строки с клавиатуры, пока не будет введена строка exit.

— Пожалуй, запомню. Чувствую, что пригодится.

Фрагмент лекции JavaRush - университета.


Фрагмент лекции JavaRush - университета.


— Но break — не единственный оператор, который позволяет управлять поведением цикла. В Java еще один оператор — continue. Если выполнить команду continue внутри цикла, текущий виток цикла завершится досрочно.

— Что за виток такой?

— Виток цикла — это выполнение тела цикла один раз. Команда continue прерывает текущий виток цикла, но не сам цикл, в отличие от команды break. Команда тоже лаконична:

continue;

— Получается, оператор continue можно использовать в цикле, если мы хотим «пропускать» выполнение некоторых витков цикла?

— Именно так. Ты понял разницу между break и continue? Если тебе нужно найти среди неповторяющихся 20 чисел семёрку, какой цикл и прерывание ты применишь?

— Хм… Я пройдусь по всем числам, и если найду 7, то выполню break.

— А если тебе нужно вывести на экран числа от 1 до 20, и при этом пропустить числа, которые делятся на 7?

— Ну тут наверное continue, поскольку не нужно выходить из цикла, но я пока не совсем понял.

— Давай я покажу тебе, как решать такую задачку. Вот как мог бы выглядеть этот код.

Код Пояснение
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0 )
     continue;
   System.out.println(i);
   i++;
}
Программа выводит на экран числа с 1 по 20. Если число делится на 7 (остаток от деления на 7 равен 0), вывод на экран пропускается.

— Почему ты на меня так подозрительно смотришь, Элли? Здесь есть какой-то подвох?

— Тебя не проведёшь, Амиго! На самом деле такой код корректно работать не будет. Он выведет первые 6 цифр, а потом i навсегда застынет на цифре 7. Ведь вызов continue привел к тому, что пропустились две команды — System.out.println(i) и i++. Поэтому по достижению значения 7, переменная i перестанет меняться, и цикл будет выполняться вечно. Я специально написала такой код, поскольку это очень распространенная ошибка.

— Как же его исправить?

— Тут есть два варианта:

Вариант 1: изменить i перед вызовом continue, но после вызова i % 7

Вариант 2: увеличивать i всегда в начале цикла. Но тогда стартовое значение i должно быть 0.

Вариант 1 Вариант 2
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0 )
   {
     i++;
     continue;
   }
   
   System.out.println(i);
   i++;
}
int i = 0;
while (i < 20)
{
   i++;
   if ( (i % 7) == 0)
     continue;
   System.out.println(i);
}

— Отлично! Постараюсь не делать этой ошибки.

— Я запомню это твоё обещание!

4
Задача
Java Syntax Pro, 4 уровень, 9 лекция
Недоступна
Площадь круга
Для решения этой задачи нужно: 1. Ввести с клавиатуры положительное целое число radius. Это будет радиус окружности. 2. Вывести на экран площадь круга, рассчитанную по формуле: S = pi * radius * radius. Результатом должно стать целое число (тип int). Для этого нужно привести к типу int результат
4
Задача
Java Syntax Pro, 4 уровень, 9 лекция
Недоступна
Share a Coke
Давай разделим ящик колы на кабинет программистов. Для этого напишем программу, в которой: 1. Нужно ввести с клавиатуры два целых числа. Первое число - количество банок колы в ящике. Второе - количество людей в кабинете. 2. Вывести на экран результат деления первого числа на второе. Результатом долж
Комментарии (29)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Jarda Уровень 11
26 июля 2022
Мне кажется в примере с Continue пропустится не только 7, но и 14.
Максим Уровень 22 Expert
3 декабря 2022
всё верно,так и пропускается )
otreyo Уровень 38
27 декабря 2021
А вариант 1 разве нет ошибки? там инкремент используется дважды за полный цикл.
Alexey Уровень 15
6 января 2022
Нет, все что в if не будет исполняться пока i не примет значение 7
Dimash Уровень 1
18 августа 2022
О 32 уровень, как успехи?
otreyo Уровень 38
26 августа 2022
пока никаких. поковырялся пару месяцев со спрингом, сделал телеграмм бот, но на собеседования никто еще даже не звал. недавно решил вернуться на джавараш. 3 месяца перерыв был.
Dimash Уровень 1
27 августа 2022
Кажется же на собеседование надо ходить самому, нет? Сколько до 33 уровня доходил?
otreyo Уровень 38
27 августа 2022
для того чтобы пойти на собеседование, надо чтобы кто то туда пригласил. но пока никто не звал. почти 4 месяца. потом перерыв 3. сейчас несколько недель как вернулся сюда. думаю если ты с нуля учишься, рассчитывай на год. быстрее вряд ли получиться. и то если регулярно заниматься и если ты технарь и с логикой все в порядке. а джавараш это только база языка. относительно простая и логичная, по сравнению со спрингом. там вообще темный лес и материала толкового для обучения в рунете очень мало.
Sammi Уровень 18
29 октября 2021
И Элли - не Элли, и " я запомню твоё обещание " :D ахахаха
BenderRB Уровень 11
3 октября 2021
Элли сделала себе операцию по изменению пола 😂
Danik Уровень 17
21 сентября 2021
Почему меняем стартовое значение?
Finding Happiness Уровень 13
5 декабря 2021
так как СРАЗУ при входе в цикл значение увеличивается. Мы как бы делаем шаг назад, чтобы сразу на входе сделать шаг вперед и оказаться там же - на нужном значении для выполнения операторов цикла.
Dimsos Уровень 29
13 сентября 2021
Никакое обещание не было дано, что за манипуляции)
Олег Уровень 9
11 августа 2021
Не понимаю, почему программа в последнем примере не пропустит число 14, оно ведь тоже делится на 7 без остатка
Vlad Polyakov Уровень 7
1 сентября 2021
Потому что цикл будет все время повторятся до команды "continue", а после этой команды к значению "i" добовляется +1.
hidden #2599455 Уровень 6
6 мая 2021
@Oleg Я тоже это заметила
 
Oleg Уровень 28
30 апреля 2021
Странно Амиго общается с Элли, а на аватаре Диего. Диего сменил ориентацию?
Олег Дурышин Уровень 17
22 марта 2021
В одной из предыдущих лекций, где объяснялся ввод с клавиатуры было написано что Scanner использоваться не будет, а будем пользоваться BufferedReader. А тут в примерах Scanner везде попер)
VladimirPic Уровень 38
2 сентября 2021
С одной стороны им проще, если работаешь только с целыми числами