Цикл do...while в Java
Цикл do...while в Java выполняет тело хотя бы один раз, прежде чем проверять условие.
Цикл do/while — это зеркальное отражение цикла while: сначала выполняется тело, а затем проверяется условие. В результате получается цикл, который гарантированно выполняется хотя бы один раз — даже если условие с самого начала было ложным. На этой странице рассматриваются синтаксис, отличия от while, когда его стоит использовать, и распространённая ошибка с областью видимости.
Синтаксис
do {
// body — runs at least once
} while (condition);Обратите внимание на точку с запятой после while (condition) — её легко пропустить, но компилятор сообщит об ошибке.
Прямой аналог примера с счётчиком для while:
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 5);Вывод: 1 2 3 4 5 — то же самое, что в варианте с while, но тело всегда выполняется первым.
Когда условие изначально ложно
Именно здесь do/while отличается от while:
int i = 10;
do {
System.out.println(i); // prints 10 once
i++;
} while (i < 5);Тело выполняется один раз, затем условие 10 < 5 оказывается ложным, и цикл завершается. Обычный while полностью пропустил бы тело.
Когда использовать do/while
Классический сценарий — проверка ввода: необходимо сначала прочитать входные данные, чтобы узнать, корректны ли они:
import java.util.Scanner;
Scanner s = new Scanner(System.in);
int n;
do {
System.out.print("Enter a positive number: ");
n = s.nextInt();
} while (n <= 0);Ещё одна удобная ситуация — циклы с меню: меню нужно показать хотя бы один раз:
int choice;
do {
showMenu();
choice = readChoice();
handle(choice);
} while (choice != 0);В обоих случаях выражение цикла через обычный while потребовало бы дублирования работы первой итерации за пределами цикла или использования дополнительной переменной-сигнала. do/while выглядит чище.
Замечание об области видимости
Переменная, объявленная внутри тела, недоступна в условии while:
do {
int x = readValue();
} while (x > 0); // compile error: x not in scopeОбъявите её снаружи:
int x;
do {
x = readValue();
} while (x > 0);Как часто вы будете его использовать
На практике do/while — наименее используемый из трёх циклов Java. Большинство циклов заранее знают, нужно ли выполняться перед первой итерацией, поэтому while и for покрывают их. Но когда естественное описание звучит как «выполнить однажды, а затем, возможно, снова», do/while — наиболее выразительный вариант.
Разбор примера
Что дальше
Наиболее распространённый цикл Java — это цикл for, который объединяет счётчик, условие и шаг обновления в одном компактном заголовке.