Циклы while и do-while в Java

Циклы while и do-while повторяют блок кода, пока условие истинно. В отличие от for, они удобны, когда заранее неизвестно, сколько повторов потребуется — например, при ожидании события от датчика или ввода пользователя.

Главное различие: while проверяет условие до выполнения тела, поэтому может ни разу не сработать. do-while сначала выполняет тело и только потом проверяет условие — поэтому тело гарантированно выполнится хотя бы один раз.

Синтаксис

while (условие) {
    // тело
}

do {
    // тело
} while (условие);

Пример 1. Простой while

public class WhileBasic {
    public static void main(String[] args) {
        int i = 1;
        while (i <= 4) {
            System.out.println("Шаг " + i);
            i++;
        }
    }
}

Вывод:

Шаг 1
Шаг 2
Шаг 3
Шаг 4

Пример 2. while с условием-флагом

public class FlagLoop {
    public static void main(String[] args) {
        boolean running = true;
        int ticks = 0;
        while (running) {
            ticks++;
            if (ticks == 3) running = false;
        }
        System.out.println("Тиков: " + ticks);
    }
}

Вывод:

Тиков: 3

Пример 3. do-while гарантированно один проход

public class DoWhile {
    public static void main(String[] args) {
        int x = 10;
        do {
            System.out.println("x = " + x);
            x++;
        } while (x < 5);   // условие ложно сразу
    }
}

Вывод:

x = 10

Пример 4. Сумма до превышения порога

public class SumUntil {
    public static void main(String[] args) {
        int sum = 0, n = 0;
        while (sum < 50) {
            n++;
            sum += n;
        }
        System.out.println("n = " + n + ", сумма = " + sum);
    }
}

Вывод:

n = 10, сумма = 55

Пример 5. Имитация чтения УЗ-датчика до близкого объекта

public class SonarWait {
    public static void main(String[] args) {
        int[] readings = {120, 95, 70, 40, 18}; // см
        int i = 0;
        int distance;
        do {
            distance = readings[i];
            System.out.println("Расстояние: " + distance + " см");
            i++;
        } while (distance > 20 && i < readings.length);
        System.out.println("Стоп: цель близко.");
    }
}

Вывод:

Расстояние: 120 см
Расстояние: 95 см
Расстояние: 70 см
Расстояние: 40 см
Расстояние: 18 см
Стоп: цель близко.

Пример 6. Проверка ввода (do-while как валидация)

public class Validate {
    public static void main(String[] args) {
        int[] attempts = {-3, 0, 17}; // имитация ввода
        int i = 0, value;
        do {
            value = attempts[i++];
            System.out.println("Попытка: " + value);
        } while (value <= 0);
        System.out.println("Принято: " + value);
    }
}

Вывод:

Попытка: -3
Попытка: 0
Попытка: 17
Принято: 17

Подводные камни

  • Бесконечный цикл. Если условие никогда не становится ложным, программа зависнет. Убедитесь, что внутри тела что-то меняется в сторону выхода.

  • Точка с запятой в do-while. После while (...) обязательно ставится ; — в отличие от обычного while.

  • Off-by-one. Условие i < n пройдёт n раз (если i стартует с 0); i <= n — n+1 раз. Аккуратно с границами.

  • while или do-while? Если тело не должно выполняться при ложном начальном условии — берите while. Если хотя бы один проход обязателен — do-while.

  • Сравнение дробных. Не выходите из цикла по равенству double — используйте порог.

См. также

Примечание

Лицензия и источники

Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.