Циклы 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.