JavaLessons
Операторы цикла (for, while, do-while), оператор break
Цикл в программировании используется для многократного повторения определенного фрагмента кода. В Java существует 3 оператора цикла: for, while, do-while.
В этом уроке мы рассмотрим:
Как применяются операторы цикла for, while, do-while. Досрочный выход из цикла В конце урока предложены упражнения для закрепления материала.
Рассмотрим подробнее использование операторов цикла в Java.
При использовании конструкции for заранее известно, сколько раз необходимо осуществить повторение. При использовании конструкций while или do-while повторения будут происходить до тех пор, пока выполняется некоторое условие (логическое выражение)
Цикл for в Java.
Рассмотрим пример: вывод на экран числа от 1 до 10.
Конструкция for имеет следующий вид:
Инициализация — первый параметр, который содержит переменную и ее начальное значение. С помощью этой переменной будет подсчитываться количество повторений цикла. В нашем примере это переменная int i = 1.
Условие — второй параметр, содержит некоторое логическое выражение — условие при котором будет выполняться цикл. В нашем примере это условие i <= 10.
Итерация — третий параметр, выражение, изменяющее переменную (заданную в инициализации) после каждого шага цикла. Изменение происходит только в случае выполнения условия. В нашем примере итерация i++ — увеличение переменной на единицу. Также для итерации часто используется i— — уменьшение переменной на единицу.
Пример: Вывод на экран чисел от 10 до −10:
Цикл while в Java.
Пример: Вывод на экран значений от 1 до 10.
Конструкция while выполняет выражение в фигурных скобках до тех пор, пока параметр логическое_выражение имеет истинное значение (true). Этот параметр является условием выполнения цикла. В выше приведенном примере, логическое выражение имеет вид i < 11.
Истинность логического выражения (условия) проверяется перед каждым шагом цикла, в том числе и перед первым. while так же называют оператором предусловия.
Приведем пример цикла, который не выполнится ни разу:
Цикл do-while в Java.
В отличие от оператора while, do-while является оператором постусловия, который сначала выполняет тело цикла, а потом осуществляет проверку условия. Таким образом, тело цикла выполнится всегда хотя бы один раз.
Пример: Вывод на экран значений от 1 до 10.
Как видно из конструкции, тело цикла выполняется перед проверкой условия. Впоследствии, тело цикла повторится в случае, если логическое_выражение было истинно. Оператор do-while удобно применять, если некоторые действия необходимо выполнить, по крайней мере, один раз, а их повторение будет зависеть от условия.
Вспомним пример цикла while, который не выполнится ни разу, и перепишем его с помощью оператора do-while
- Как реализовать бесконечный цикл?
- Сколько операторов цикла существует в языке Java?
- В данном коде, на консоль будут выведены числа от 1 и до скольки?
Branching Statements
The break statement has two forms: labeled and unlabeled. You saw the unlabeled form in the previous discussion of the switch statement. You can also use an unlabeled break to terminate a for , while , or do-while loop, as shown in the following BreakDemo program:
This program searches for the number 12 in an array. The break statement, shown in boldface, terminates the for loop when that value is found. Control flow then transfers to the statement after the for loop. This program's output is:
An unlabeled break statement terminates the innermost switch , for , while , or do-while statement, but a labeled break terminates an outer statement. The following program, BreakWithLabelDemo , is similar to the previous program, but uses nested for loops to search for a value in a two-dimensional array. When the value is found, a labeled break terminates the outer for loop (labeled "search"):
This is the output of the program.
The break statement terminates the labeled statement; it does not transfer the flow of control to the label. Control flow is transferred to the statement immediately following the labeled (terminated) statement.
The continue Statement
The continue statement skips the current iteration of a for , while , or do-while loop. The unlabeled form skips to the end of the innermost loop's body and evaluates the boolean expression that controls the loop. The following program, ContinueDemo , steps through a String , counting the occurrences of the letter "p". If the current character is not a p, the continue statement skips the rest of the loop and proceeds to the next character. If it is a "p", the program increments the letter count.
Here is the output of this program:
To see this effect more clearly, try removing the continue statement and recompiling. When you run the program again, the count will be wrong, saying that it found 35 p's instead of 9.
A labeled continue statement skips the current iteration of an outer loop marked with the given label. The following example program, ContinueWithLabelDemo , uses nested loops to search for a substring within another string. Two nested loops are required: one to iterate over the substring and one to iterate over the string being searched. The following program, ContinueWithLabelDemo , uses the labeled form of continue to skip an iteration in the outer loop.
Here is the output from this program.
The return Statement
The last of the branching statements is the return statement. The return statement exits from the current method, and control flow returns to where the method was invoked. The return statement has two forms: one that returns a value, and one that doesn't. To return a value, simply put the value (or an expression that calculates the value) after the return keyword.
The data type of the returned value must match the type of the method's declared return value. When a method is declared void , use the form of return that doesn't return a value.
The Classes and Objects lesson will cover everything you need to know about writing methods.
Цикл for
Конструкция for управляет циклами. Команда выполняется до тех пор, пока управляющее логическое выражение не станет ложным.
Цикл for является наиболее распространённым циклом в программировании, поэтому его следует изучить. Цикл for проводит инициализацию перед первым шагом цикла. Затем выполняется проверка условия цикла, и в конце каждой итерации происходит изменение управляющей переменной. Выглядит следующим образом:
Любое из трёх выражений цикла (инициализация, логическое выражение или шаг) можно пропустить. Перед выполнением каждого шага цикла проверяется условие цикла. Если условие окажется ложным, то выполнение продолжится с инструкции, следующей за конструкцией for.
Помните, что выражение инициализации выполняется один раз, затем вычисляется условие, которое должно быть булевым выражением.
Как правило, цикл for используют для перебора. В качестве имени первой переменной часто используют i (сокр. от init), но вы можете использовать любое имя.

В этом примере переменной x присваивается начальное значение, равное нулю. Затем выполняется проверка условия в логическом выражении (x < 9), если результат проверки истинен, то выполняется оператор после выражения цикла. После чего процесс повторяется. Процесс продолжается до тех пор, пока результат проверки условия не станет ложным.
Третье выражение в цикле — шаг, то есть, на какое значение нужно изменить переменную. Строго говоря, в таком виде (x = x + 1) современные программисты не пишут, так как есть укороченная форма записи (x++). Предыдущий пример можно переписать по другому:
Эта запись является классической и правильной, если нам нужно посчитать от 0 до 8. Может возникнуть соблазн написать, например, так:
Результат будет таким же, но такой код нежелателен. Старайтесь писать традиционно. Особенно это проявляется при работе с массивами.
Увеличение значения переменной на единицу — весьма распространённый случай. Но это не является обязательным условием цикла, вы можете установить шаг и с помощью умножения, вычитания и других действий. Например, мы хотим вывести процесс уменьшения жизней у очень любопытной кошки:

Попробуйте потренироваться на кошках . Например, выводим чётные числа.
Если нужно выполнить несколько операторов в цикле, то используют фигурные скобки.
В этом примере выполняется цикл с выводом числа подсчитанных котят, а также выводится текст в текстовом поле. Кстати, это один из примеров неправильного кода, когда в текстовом поле девять раз подряд выводится одна и та же строка. Мы этого не замечаем, но в реальности процессор выполняет лишнюю работу и второй оператор безусловно нужно вынести за пределы блока кода, который относится к циклу. Подобные ошибки очень часто встречаются у начинающих программистов, которые забывают, как работает цикл.
Когда мы объявляем переменную в первой части оператора for(int i = 0; . ), то область видимости переменной ограничена телом цикла и эта переменная не доступна на другом участке кода. Это подходящий вариант, если переменная больше нигде не используется. При этом переменная имеет область видимости и продолжительность существования, совпадающие с видимостью и продолжительностью жизни самого цикла. Вне цикла переменная прекратит своё существование.
Если управляющую переменную цикла нужно использовать в других частях приложения, то её не следует объявлять внутри цикла.
С другой стороны, если видимость переменной ограничена в пределах цикла, то не будет никакого конфликта, если вы будете использовать одинаковые имена переменных в разных циклах for, так как они не будут друг другу мешать.
Использование нескольких переменных
Иногда требуется указать несколько переменных в инициализационной части цикла. Для начала посмотрим на стандартный пример:
В данном цикле используются две переменные. Можно включить обе переменные в оператор for, чтобы не выполнять обработку второй переменной вручную:
Как видно из кода, запятая служит разделителем для двух переменных. Теперь оба разделённых запятой оператора в итерационной части цикла выполняются при каждом выполнении цикла. Данный код считается более эффективным, хотя на практике встречается редко.
Части цикла могут быть пустыми.
Оставим пустым первое выражение.
В следующем примере нет инициализационного и итерационного выражения:
А можно вообще все три части оператора оставить пустыми:
В этом случае создаётся бесконечный цикл, который никогда не завершится. Практического смысла данный код не имеет.
Работа с массивами
С обычными числами обычно не работают в цикле for. Гораздо чаще цикл используют при работе с массивами.
Основная разница между ними, что массив может состоять из неупорядоченных чисел, а число элементов может быть разным. К счастью, у массива есть специальное свойство length — длина массива. Первый пример можно переписать следующим образом.
Мы создали массив из чисел от 0 до 9. Затем проходим в цикле, но на этот раз во втором операторе не используем число 9, а вычисляем длину массива. Такой гибкий подход позволят проделывать с массивами разные трюки — упорядочивать, сортировать, переворачивать и т.д.
Например, если мы хотим вывести числа в обратном порядке, меняем логику следующим образом. Теперь нам нужно начинать вывод не с 0, а с 9, т.е. int i = 9 или int i = mice.length — 1 (для универсальности). Шаг будет не увеличиваться, а уменьшаться, значит — i—. А условием станет достижение 0, т.е. i >= 0. Проверяем.
Аналог foreach
Во многих языках существует более компактная форма for для перебора элементов массивов — foreach. Конструкция foreach не требует ручного изменения переменной-шага для перебора — цикл автоматически выполняет эту работу.
В Java решили не добавлять новое ключевое слово, а просто сделали усовершенствованный вид цикла for, который имеет вид:
Для сравнения напишем цикл для вычисления суммы значений элементов массива традиционным способом:
Этот код можно переписать следующим образом:
При прохождении цикла переменной i автоматически присваивается значение, равное значению следующего элемента массива nums. Таким образом, при первом прохождении переменная i содержит значение 1, при втором — 2 и т.д. Кроме того при таком способе исключается возможность ошибок выхода за пределы массива.
Для этого способа можно использовать массив или любой класс с интерфейсом Iterable.
Можно прервать выполнение цикла с помощью оператора break:
Учтите, что в цикле в стиле foreach итерационная переменная доступна только для чтения, так как она связана только с исходным массивом. Даже если вы измените её значение, то это не повлияет на работу с массивом.
Также можно использовать данный способ для многомерных массивов.
Поскольку каждый оператор for в стиле foreach перебирает элементы массива последовательно, начиная с первого и заканчивая последним, то данный способ удобен для многих операций. Например, для поиска значения в неупорядоченном массиве. Поиск прекращается после обнаружения нужного значения.
Так как у нас неупорядоченный список, то нам нужно последовательно пройтись по всем элементам. Если нам повезёт и нужное значение встретится при переборе, то выходим из цикла и идём спать .
Вложенные циклы
Также допустимо использование вложенных циклов, когда один цикл выполняется внутри другого:
В результате получим:
При вложенных циклах количество повторений перемножается. В предыдущем примере было 100 повторений. Например, можно написать таблицу умножения.
Результат смотрите в вкладке LogCat.
Цикл for является более удобным вариантом цикла while.
Этот же вариант с while:
С помощью цикла можно рисовать красивые узоры, меняя координаты одной фигуры.
Треугольник Флойда
Составьте «Треугольник Флойда», который выглядит как набор чисел, которые увеличиваются на единицу. Например, треугольник с высотой шесть строк выглядит следующим образом.
Оператор break в Java

Если Вы уже сталкивались с циклами, то Вы уже знаете, что все они, чаще всего, имеют одинаковые составляющие:
- переменную итерации
- условие
- шаг итерации
For, while, do. while выполняют одинаковые функции. Можно сказать, что циклы достаточно простые и предсказуемые — они просто изменяют заданную переменную n-ное количество раз.
Но существуют ключевые слова, которые дают нам больше власти над циклом. Они позволяют нам:
- завершить цикл раньше времени (оператор break)
- проигнорировать часть кода (оператор continue)
В некоторых ситуациях они позволят Вам найти более практичное и элегантное решение поставленных задач. Давайте рассмотрим их подробнее.
Также к операторам перехода относится ключевое слово return, но для его изучения Вам нужно продвинуться чуть-чуть дальше в нашем самоучителе. Поэтому, в этой статье про него рассказывать не будем. Вы узнаете о нем немного позже.
Оператор break
С английского «break» переводится как «останавливать, прерывать«. Как уже было сказано выше, оператор break позволяет прервать выполнение цикла в любой удобный для программиста момент — раньше, чем цикл «должен был бы» завершиться. Примерно вот так:
Синтаксис
Записывается оператор break так:
Как видите, никаких скобочек, точечек или чего-нибудь еще — просто ключевое слово «break«, а потом точка с запятой. Сказал как «остановил»:)
Оператор break для выхода из цикла
В цикле (например, в цикле while) он будет выглядеть так:
Итак, что тут происходит?
Тут у нас есть цикл while, который стандартно должен был бы выполняться пять раз. Проверим это. Вот код без оператора break:
в консоли мы бы получили:
1: цикл выполняется!
2: цикл выполняется!
3: цикл выполняется!
4: цикл выполняется!
5: цикл выполняется!
Но потом мы добавляем оператор if. Мы решили, что если переменная i станет равна переменной а, (т.е. станет равна трем) нам нужно остановить цикл. Таким образом, мы написали:
В итоге, в консоле мы получили:
1: цикл выполняется!
2: цикл выполняется!
3: цикл выполняется!
То-есть когда переменная i приобрела значение 3, цикл завершился. Точно так же оператор break будет работать и с любыми другими циклами — for, do. while и так далее. просто вставьте эти строчки в нужный цикл:
Оператор break для выхода из цикла: вложенные циклы
Но тут может возникнуть вопрос — что будет, если циклов не один, а несколько? И как будет работать такой код:
Вы видите два цикла for. Во втором, «внутреннем» цикле, находится оператор break. Итак, когда выполнится условие — а именно когда а будет равен двум — остановится только второй цикл, или оба? Чтобы понять, давайте посмотрим, что покажет консоль.
Итак, в результате имеем:
Это первый цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз
Это первый цикл! Я выполняюсь 2 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз
Это первый цикл! Я выполняюсь 3 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз
Как видите, первый цикл выполняется 3 раза, как и должен был. При этом, второй цикл — каждый раз только два раза. А это значит, что оператор break прерывает только один цикл — тот, который его непосредственно вызывает.
Оператор break и оператор switch
И на последов, есть еще одно применение оператора break. Если Вы читали статью нашу статью про оператор switch:
то Вы могли уже встречать оператор break. Вот пример из той статьи: