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);
}