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

Открыта

Квест Java Syntax Pro еще в разработке

Сейчас мы вычитываем лекции и работаем над задачами. Если заметили ошибки — пишите в комментариях: всё учтем перед релизом. Спасибо!


1. Команда 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.


2. Команда continue

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

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

continue;

Этот оператор continue очень удобно использовать в цикле, если мы хотим «пропускать» выполнение тела цикла для некоторых ситуаций.

Задача: мы хотим написать программу, которая выводит на экран 20 чисел от 1 до 20, и при этом пропускает числа, которые делятся на 7. Вот как мог бы выглядеть этот код:

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

На самом деле такой код работать не будет, потому что 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);
}

Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Денис Кайдунов
38 уровень, Гомель
26 марта, 12:45
#БАГ правая картинка опечатки в тексте "когда они начнут"
Беовульф
16 уровень
24 сентября 2020, 13:20
Не хватает комикса в конце лекции :)
Сергей Кобзев
4 уровень, Оренбург
10 сентября 2020, 11:15
Всем привет! Как упрощает цикл команда break в первом примере? Что с ним что без него программа будет считывать текст по ка не появится "exit".
Сергей Кобзев
4 уровень, Оренбург
10 сентября 2020, 11:26
Разобрался)
Sveta Psikhovski
8 уровень, Санкт-Петербург
24 мая 2020, 20:36
Всем привет) не судите строго, только начинаю изучать джаву и есть много вопросов, буду рада, если ответите на один, хоть и (возможно) очень глупый. Условие цикла (!isExit) - что это за "!"? Не понимаю суть, которую несёт восклицательный знак. Опять-таки, буду очень благодарна за разъяснения, надеюсь вопрос задала понятно)))
Егор
18 уровень, Тюмень
25 мая 2020, 04:01
в программировании это отрицание. если isExit = false, то !IsExit = true
Sveta Psikhovski
8 уровень, Санкт-Петербург
27 мая 2020, 15:33
спасибо большое!
Павел Мархель
1 уровень, Минск
20 ноября 2020, 09:19
! - переводится, как НЕ
Vit
19 уровень
16 апреля 2020, 13:41
Вопрос ! А если в не рабочем коде заменить ==0 на !=0 и убрать continue; что так нельзя?
koshi
9 уровень, Уфа
3 мая 2020, 10:42
Ну, если забыть, что в примере разбирается действие continue, то можно.
Анна
2 уровень, Уфа
12 апреля 2020, 16:56
"выводит на экран 20 чисел от 1 до 20, и при этом пропускает числа, которые делятся на 7." Если числа пропускаются, то их не 20 получается же
zatolokinboris
22 уровень, Москва
2 марта 2020, 13:36
По правкам: isExit станет true, а условие цикла !isExit примет значение false и цикл завершиться. На самом деле такой код работать не будет, потому что i навсегда застынет на цифре 7. Ведь вызов continue привел к тому, пропустились две команды System.out.println() и i++. - возможно тут не хватает слова - "что".
6 февраля 2020, 15:59
у меня код с пропусками чисел котрые делятся на 7 с работал