🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!
Сегодня мы рассмотрим, как работает цикл do-while
в Java.

Что такое цикл do-while?
Иногда бывает необходимо запустить какой-то код хотя бы один раз без всяких предварительных условий, «но» и «если». Например, при создании интерактивного меню в интерфейсе важно учитывать, что пользователь сначала должен увидеть предлагаемые варианты, а потом ввести свои данные (наглядный пример: когда мы подходим к банкомату, чтобы снять деньги, нам предлагаются различные опции; только выбрав одну из них, мы можем ввести нужную сумму). Другой пример – когда нам нужно получить корректный ввод, но проверить его можно только после того, как пользователь введет данные. В подобных ситуациях на помощь приходят циклы do-while
.
Обычный цикл while
очень осторожен: он сначала проверит условие и только потом выполнит код. А do-while
напоминает друга, который сначала прыгает в бассейн, а потом спрашивает, насколько он глубокий: сначала выполнится блок кода, а потом произойдет проверка условия.
Используя цикл do-while
, мы как бы говорим: «сделай это хотя бы один раз, а затем продолжай делать, пока заданное условие остается истинным».
Синтаксис
Вот как это выглядит:
do {
// Место для ваших фантазий
} while (condition);
Run CodeОбратите внимание на точку с запятой в конце: её нельзя пропускать! С её помощью вы как бы даете понять, что закончили.
Что происходит:
- Сначала выполняется код внутри { }.
- Затем происходит проверка условия.
- Цикл повторяется, если условие истинно.
- Если условие ложно, мы выходим из цикла.
Простой пример:
int count = 1;
do {
System.out.println("Count's at: " + count);
count++;
} while (count <= 5);
Run CodeНа выводе получим:
Count's at: 1
Count's at: 2
Count's at: 3
Count's at: 4
Count's at: 5
Даже если изначально count = 10, код все равно выполнится один раз:
int count = 10;
do {
System.out.println("Count's at: " + count);
count++;
} while (count <= 5);
Run CodeВывод:
Count's at: 10
Блок-схема, позволяющая наглядно продемонстрировать работу цикла do-while
, выглядит так:
Start → Run the code → Check condition? → Yes → Back to run code
↓ No
Exit
Run CodeНаглядный пример
Изучим такой код для работы с числами:
int number = 1;
do {
System.out.println("Number's at: " + number);
number *= 2;
} while (number < 20);
Run CodeПройдемся по нему, как будто вместе занимаемся отладкой:
Номер цикла | Число до | Вывод | Число после | Число < 20? | Следующий ход |
1 | 1 | Выводит “Number’s at: 1”, удваивает его | 2 | Да (2 < 20) | Продолжить |
2 | 2 | Выводит “Number’s at: 2”, удваивает его | 4 | Да (4 < 20) | Продолжить |
3 | 4 | Выводит “Number’s at: 4”, удваивает его | 8 | Да (8 < 20) | Продолжить |
4 | 8 | Выводит “Number’s at: 8”, удваивает его | 16 | Да (16 < 20) | Продолжить |
5 | 16 | Выводит “Number’s at: 16”, удваивает его | 32 | Нет (32 < 20) | Остановиться |
Вывод:
Number's at: 1
Number's at: 2
Number's at: 4
Number's at: 8
Number's at: 16
Пример проверки достоверности пользовательского ввода
Цикл do-while
очень удобен, например, когда нужно вежливо, но настойчиво требовать корректный ввод:
import java.util.Scanner;
public class InputCheck {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int userNumber;
do {
System.out.print("Gimme a positive number: ");
userNumber = scanner.nextInt();
if (userNumber <= 0) {
System.out.println("C'mon, that's not positive. Try again!");
}
} while (userNumber <= 0);
System.out.println("Sweet! You gave me: " + userNumber);
scanner.close();
}
}
Run CodeСравнение циклов do-while и while
Синтаксис
Цикл while выглядит так:
while (condition) {
// Stuff happens here
}
Run CodeА цикл do-while – так:
do {
// Stuff happens here
} while (condition);
Run CodeВ чем разница? Цикл while
сначала проверяет условие, а do-while сразу врывается, начинает действовать, и только потом оглядывается.
Когда использовать какой?
- Цикл
while
можно использовать, когда вам даже не нужно запускать код: например, для проверки наличия файла перед его чтением. - Цикл
do-while
лучше применять, когда необходимо выполнить код один раз: например, показать меню, прежде чем спросить, чего хочет пользователь.
Наглядное сравнение:
int i = 10;
System.out.println("With while:");
while (i < 5) {
System.out.println("i is: " + i);
i++;
}
i = 10;
System.out.println("\nWith do-while:");
do {
System.out.println("i is: " + i);
i++;
} while (i < 5);
Run CodeВыводы соответственно:
With while:
With do-while:
i is: 10
Два способа решения одной задачи
Задача довольно классическая: пользователю предстоит выбрать и ввести число от 1 до 10.
При использовании цикла while
код будет выглядеть так:
import java.util.Scanner;
public class WhileWay {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = 0;
System.out.print("Pick a number 1-10: ");
number = scanner.nextInt();
while (number < 1 || number > 10) {
System.out.println("Nope, that's off!");
System.out.print("Try again (1-10): ");
number = scanner.nextInt();
}
System.out.println("Nice one! You picked: " + number);
scanner.close();
}
}
Run CodeА при использовании цикла do-while
– так:
import java.util.Scanner;
public class DoWhileWay {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number;
do {
System.out.print("Pick a number 1-10: ");
number = scanner.nextInt();
if (number < 1 || number > 10) {
System.out.println("Hey, stick to the rules!");
}
} while (number < 1 || number > 10);
System.out.println("Awesome! You picked: " + number);
scanner.close();
}
}
Run CodeЦикл do-while
работает более “гладко” – в коде нет повторяющихся запросов за пределами цикла.
Несколько полезных примеров
1. Упорядоченное меню
Ниже представлен код с использованием цикла do-while
. Без него меню было бы неупорядоченным.
import java.util.Scanner;
public class ShopMenu {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("\n=== Shop Menu ===");
System.out.println("1. Check Stock");
System.out.println("2. Add Item");
System.out.println("3. Update Item");
System.out.println("4. Remove Item");
System.out.println("5. Quit");
System.out.print("What's your pick (1-5)? ");
choice = scanner.nextInt();
switch (choice) {
case 1: System.out.println("Checking stock..."); break;
case 2: System.out.println("Adding item..."); break;
case 3: System.out.println("Updating item..."); break;
case 4: System.out.println("Removing item..."); break;
case 5: System.out.println("See ya!"); break;
default: System.out.println("Huh? Try again.");
}
} while (choice != 5);
scanner.close();
}
}
Run Code2. Повторные попытки подключения к сети
Вам когда-нибудь приходилось пинговать сервер, который работает нестабильно? Вот как можно было бы реализовать повторные попытки:
import java.io.IOException;
import java.net.Socket;
public class NetworkPing {
public static void main(String[] args) {
String host = "example.com";
int port = 80;
int tries = 0;
int maxTries = 5;
boolean connected = false;
do {
System.out.println("Trying " + host + ":" + port + " (Try " + (tries + 1) + " of " + maxTries + ")");
try {
Socket socket = new Socket(host, port);
connected = true;
System.out.println("Got it!");
socket.close();
} catch (IOException e) {
System.out.println("No dice: " + e.getMessage());
tries++;
try {
Thread.sleep(1000); // Chill for a sec
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
} while (!connected && tries < maxTries);
if (!connected) {
System.out.println("Couldn't connect after " + maxTries + " shots.");
}
}
}
Run CodeРаспространенные ошибки и советы по отладке
1. Пропущенная точка с запятой
// Неверно
do {
System.out.println("This flops");
} while (true) // Отсутствие точки с запятой - большая ошибка!
// Верно
do {
System.out.println("This works");
} while (true); // Всё супер!
Run Code2. Бесконечные циклы
int count = 1;
do {
System.out.println("Count's: " + count);
// Здесь мы кое-что забыли
} while (count < 10);
Run CodeНам нужен “сдвиг”, чтобы счетчик увеличивался:
int count = 1;
do {
System.out.println("Count's: " + count);
count++;
} while (count < 10);
Run Code3. Перелет на единицу
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 10); // Цикл выполнится на 1 итерацию больше, код выведет 11 элементов
// Исправим:
int i = 1;
do {
System.out.println(i);
i++;
} while (i < 11); // Теперь количество итераций - 10
Run CodeЛайфхаки для отладки
Если код ведет себя странно:
- Используйте
System.out.println("count = " + count);
для того, чтобы отслеживать переменные. - Используйте отладчик в вашей IDE для пошагового выполнения.
- Добавьте счётчик-ограничитель, чтобы предотвратить бесконечный цикл:
int tries = 0;
do {
// Код
tries++;
if (tries > 1000) {
System.out.println("Whoa, too many loops!");
break;
}
} while (condition);
Run CodeЗадача для читателей
Создайте игру, в которой:
- Компьютер выбирает случайное число (1-100).
- Попробуйте его угадать.
- Каждый раз компьютер будет вам сообщать, загаданное число больше или меньше.
Вот как вы можете начать:
import java.util.Scanner;
import java.util.Random;
public class GuessGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int secret = random.nextInt(100) + 1;
int guess;
int tries = 0;
System.out.println("I've got a number between 1 and 100. Guess it!");
// Добавьте ваш код
scanner.close();
}
}
Run CodeВариант решения
import java.util.Scanner;
import java.util.Random;
public class GuessGameSolution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int secret = random.nextInt(100) + 1;
int guess;
int tries = 0;
System.out.println("I've got a number between 1 and 100. Guess it!");
do {
System.out.print("Your guess: ");
guess = scanner.nextInt();
tries++;
if (guess < secret) {
System.out.println("Go higher!");
} else if (guess > secret) {
System.out.println("Go lower!");
} else {
System.out.println("You nailed it in " + tries + " tries!");
}
} while (guess != secret);
scanner.close();
}
}
Run CodeЗаключение
Цикл do-while
— это важная конструкция в Java, которая гарантирует хотя бы одно выполнение блока кода перед проверкой условия. Это идеальный выбор для разработки меню в пользовательском интерфейсе, проверки пользовательского ввода и в целом ситуаций, когда действие должно выполниться до проверки условия.
В отличие от обычного while
, который может не выполниться ни разу (если условие изначально ложно), do-while
всегда запускается как минимум один раз. Эта особенность часто делает код чище и понятнее.
Помните о ключевых моментах:
- Используйте do-while, когда нужно хотя бы одно выполнение.
- Не забывайте про точку с запятой.
- Контролируйте переменные цикла, чтобы избежать бесконечного выполнения.
- Следите за граничными условиями, чтобы количество итераций соответствовало ожидаемому.
Перевод статьи «Java Do While Loop».
Может пригодиться: «Цикл for в Java»