Циклы
Цикл повторяет блок кода, пока выполняется условие. Без циклов, чтобы вывести числа от 1 до 100, пришлось бы написать сто одинаковых строк. Одно выполнение тела цикла называется итерацией.
while
Цикл while проверяет условие перед каждой итерацией. Пока оно истинно, тело выполняется снова и снова:
void main() {
int count = 1;
while (count <= 3) {
IO.println("Итерация " + count);
count++;
}
}Результат:
Итерация 1
Итерация 2
Итерация 3Внутри цикла переменная count обязательно меняется. Иначе условие навсегда останется истинным, и получится бесконечный цикл.
do-while
do-while сначала выполняет тело, а потом проверяет условие. Поэтому тело выполнится хотя бы один раз, даже если условие ложно с самого начала:
void main() {
int attempts = 5;
do {
IO.println("Попытка " + attempts);
attempts++;
} while (attempts < 3);
}Результат:
Попытка 5for
Цикл for собирает всё управление в одну строку: начальное значение счётчика, условие и шаг. Это самый частый цикл, когда число повторений известно заранее:
void main() {
for (int i = 1; i <= 5; i++) {
IO.print(i + " ");
}
IO.println();
}Результат:
1 2 3 4 5Сначала выполняется int i = 1, затем перед каждой итерацией проверяется i <= 5, а после итерации выполняется i++. Шаг может быть любым, например i += 2 или i-- для обратного отсчёта.
Накопление результата
Часто цикл не просто выводит значения, а копит результат в переменной, объявленной до цикла:
void main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
IO.println(sum);
}Результат:
5050for-each
Массив — это набор значений одного типа под одним именем, подробно о нём рассказывает урок о массивах. Перебрать все его элементы удобнее всего циклом for-each: переменная слева от двоеточия по очереди получает каждый элемент:
void main() {
String[] names = {"Анна", "Олег", "Мария"};
for (String name : names) {
IO.println("Привет, " + name);
}
}Результат:
Привет, Анна
Привет, Олег
Привет, Марияfor-each не даёт индекса элемента. Если индекс нужен, используйте обычный for.
Частая ошибка
Индексы массива начинаются с нуля, поэтому последний элемент имеет индекс length - 1. Условие <= вместо < заставляет цикл выйти за пределы массива:
void main() {
int[] prices = {10, 20, 30};
for (int i = 0; i <= prices.length; i++) {
IO.println(prices[i]);
}
}Результат:
10
20
30
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3Для обхода массива по индексам пишите i < prices.length.