W3docs

Цикл 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— editable, runs on the server

Что дальше

Наиболее распространённый цикл Java — это цикл for, который объединяет счётчик, условие и шаг обновления в одном компактном заголовке.

Практика

Практика
Сколько раз выполнится этот цикл? int i = 10; do { System.out.println(i); i++; } while (i < 5);
Сколько раз выполнится этот цикл? int i = 10; do { System.out.println(i); i++; } while (i < 5);
Was this page helpful?