Гид по технологиям

Циклы в Java: for, while, do-while — руководство

5 min read Java Обновлено 09 Jan 2026
Циклы в Java: for, while, do-while — руководство
Циклы в Java: for, while, do-while — руководство

Программист за компьютером, набирает код

Что такое цикл (одна строка)

Итерация — повторное выполнение набора инструкций; цикл управляет этими повторениями по условию или по счётчику.

Быстрая навигация

  • For: цикл с контролем счётчика.
  • While: цикл по условию до входа.
  • Do-while: цикл по условию после тела (гарантирован хотя бы один запуск).

1. For цикл

For — это итерация, контролируемая счётчиком. Обычно используется, когда заранее известен диапазон итераций.

Синтаксис:

for (initialization; condition; increment) {
    // statements
}

Все три части внутри круглых скобок могут быть опущены, но точки с запятой (;) обязательны.

Пример, где счётчик объявлен вне цикла:

int x = 4;

for ( ; x < 10; x++) {
    System.out.println(x); // вывод x
}

Если опустить условие, получится бесконечный цикл, потому что компилятор трактует его как всегда истинное:

for (;;) {
    // бесконечный цикл
}

Важно: если вы объявляете управляющую переменную прямо в заголовке for (например, for (int i = 0; …)), то её область видимости ограничена блоком цикла. Объявленная снаружи — доступна после цикла.

Вложенные циклы

for (int x = 2; x < 9; x = x + 2) {
    for (int y = 5; y >= 3; y--) {
        System.out.println(x * y); // вывод произведения x и y
    }
}

Рекомендация: по мере усложнения логики избегайте более трёх уровней вложенности — это снижает читаемость и сложность отладки.

Примечание: инкремент может быть любым выражением (x = x + 2, x += 5, x–) и не обязательно +1.

2. While цикл

While используют, когда количество итераций заранее неизвестно и решающую роль играет условие.

Синтаксис:

while (condition) {
    // statements
}

Альтернативный вариант, эквивалентный for:

initialization;

while (condition) {
    // statements
    increment;
}

Если внутри цикла нет выражения, которое в какой-то момент сделает условие ложным, вы получите логическую ошибку — бесконечный цикл.

3. Do-while цикл

Do-while похож на while, но гарантирует хотя бы одно выполнение тела. Сначала выполняется блок do {}, затем проверяется условие.

do {
    // statements to execute
} while (loop-continuation condition);

Этот паттерн полезен, когда нужно сначала запросить ввод пользователя или выполнить какую-то инициализацию, а уже затем проверять условие повторения.

Особенности области видимости и off-by-one

Частая ошибка — неправильная граница при работе с индексами массивов. В Java индексы массивов начинаются с 0 и для массива длиной N последний индекс — N-1. Поэтому часто безопаснее писать проверку с <= или >= в случаях, где это оправдано, но правильнее сравнивать с длиной массива явно:

for (int i = 0; i < arr.length; i++) {
    // безопасная итерация по массиву
}

Если вместо i < arr.length поставить i <= arr.length — будет ArrayIndexOutOfBoundsException.

Когда выбирать какую конструкцию

  • For — счётчик и известное число итераций.
  • While — неизвестно, сколько итераций потребуется; проверка до входа.
  • Do-while — нужно гарантированно выполнить тело хотя бы один раз.

Альтернативы и современные подходы

  • Цикл for-each (enhanced for) для простого перебора коллекций и массивов:
for (String s : list) {
    System.out.println(s);
}
  • Stream API (java.util.stream) и функциональные операции (map, filter, forEach) для декларативной обработки коллекций.
  • Итераторы (Iterator) при необходимости управлять удалением элементов во время перебора.

Преимущества альтернатив: короче код, меньше ошибок с индексами; недостаток: не всегда подходят, если нужен доступ по индексу или несколько счётчиков.

Распространённые ошибки — примеры и как их избегать

  • Off-by-one (иногда неправильно указывают <= вместо <). Решение: явно думайте в терминах индексов и длины.
  • Изменение счётчика внутри тела цикла непредсказуемым способом. Решение: старайтесь менять счётчик в одном месте и документировать причину.
  • Бесконечные циклы: забытые инкременты/условия. Используйте тесты, таймауты или счётчики защитного выхода.
  • Слишком глубокая вложенность: рефакторьте в функции или используйте состояния/табличную логику.

Эвристики и модели мышления

  • Модель «счётчик vs состояние»: если цикл считает шаги — for; если он ждёт события — while.
  • «Предварительная» vs «пост-условная» проверка: подумайте, нужно ли выполнить тело хотя бы один раз.
  • «Итерация по коллекции — избегай индексов»: откажитесь от индексов, когда работаете со списками.

Чеклист для ролей

  • Разработчик:
    • Выбрал подходящую конструкцию (for/while/do-while/for-each).
    • Проверил границы (0..length-1).
    • Не изменяет управляющие переменные непоследовательно.
  • Код-ревьюер:
    • Проверил отсутствие бесконечных циклов.
    • Оценил читаемость и вложенность.
    • Предложил использование Stream/for-each, если уместно.
  • Тестировщик:
    • Написал тесты на граничные значения (пустая коллекция, один элемент, максимальные размеры).
    • Проверил поведение при невалидном входе.

Критерии приёмки

  • Все циклы покрыты тестами для пустых и типичных входных данных.
  • Нет исключений при нормальных границах (нет ArrayIndexOutOfBounds).
  • Читаемость соответствует кодстайлу проекта (максимум допустимой вложенности).

Тестовые сценарии (acceptance)

  • Перебор массива длиной 0: цикл не должен выполнять тело.
  • Перебор массива длиной 1: тело выполняется один раз.
  • Нестандартный шаг инкремента (x += 2): результат соответствует ожиданиям.
  • Потенциально бесконечный цикл: при достижении защитного лимита тест завершает выполнение и сообщает ошибку.

Примеры ошибок (контрпримеры)

  • Неправильная граница:
for (int i = 0; i <= arr.length; i++) { // ОШИБКА: выйдем за пределы
    System.out.println(arr[i]);
}
  • Непреднамеренное изменение счётчика в теле:
for (int i = 0; i < 10; i++) {
    if (someCondition) i++; // усложняет логику и может привести к пропускам
}

Короткий глоссарий (1 строка)

  • Итерация — один цикл выполнения тела; инкремент — шаг изменения счётчика; бесконечный цикл — цикл без пути к завершению.

Маленькая методология: как рефакторить сложные циклы

  1. Выделите тело цикла в отдельный метод с понятным именем.
  2. Проверьте и упростите условие продолжения.
  3. Если есть несколько счётчиков — задумайтесь о структуре данных или состоянии.
  4. Добавьте тесты для границ.

Советы по производительности и безопасности

  • Минимизируйте вычисления в условии цикла (например, сохраняйте arr.length в локальную переменную при необходимости).
  • Для больших коллекций предпочитайте итераторы или Stream с аккуратно настроенными параллельными операциями.
  • Избегайте побочных эффектов в теле цикла, если нужен детерминированный результат.

Looping Back to Java Arrays

При работе с массивами помните, что индексация с нуля — основное правило. Проверяйте условия на длину массива и не меняйте индекс внутри цикла без крайней необходимости. Для обхода массивов и списков используйте for-each, если не требуется индекс.

Итог

Циклы — базовый навык любого Java‑программиста. Понимайте семантику каждой конструкции и выбирайте ту, которая делает код проще и безопаснее. Тестируйте граничные случаи, избегайте глубоких вложенностей и предпочтите декларативные альтернативы (for-each, Stream), когда это оправдано.

Важно: корректная проверка границ и понимание области видимости переменных исключают большинство типичных ошибок с циклами.

Краткое резюме:

  • For — для счётчиков.
  • While — для повторений, основанных на условии.
  • Do-while — когда нужно хотя бы одно выполнение.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство