GrabDuck

Java 8 операторы управления порядком выполнения — urvanov.ru

:

Цикл статей «Учебник Java 8».

Следующая статья — «Пакеты в Java 8».
Предыдущая статья — «Java 8 выражения, инструкции и блоки».

Инструкции (операторы) в программе выполняются сверху вниз по исходному файлы. Операторы управления порядком выполнения позволяют прервать обычный ход выполнения, позволив выполнить один кусок кода несколько раз, выполнить кусок кода только при выполнении определённого условия.

Содержание

Оператор if-then и if-then-else
Оператор switch
Оператор while
Оператор do-while
Оператор for
Оператор break
Оператор continue
Оператор return

Оператор if-then и if-then-else

Оператор if-then / if-then-else  позволяет выполнить один оператор или блок операторов только при выполнении определённого условия. Он имеет две формы. Форма if-then  позволяет выполнить кусок кода при выполнении определённого условия, а форма if-then-else  в дополнение к этому позволяет ещё указать кусок кода, который будет выполняться при НЕвыполнении этого условия.

Синтаксис if-then  для куска кода из одного оператора:

Синтаксис if-then  для блока операторов:

Оператор if-then  выполняется так:

  1. Вычисляется результат выражения <выражение_boolean> , которое должно обязательно вернуть тип boolean.
  2. Если выражение <выражение_boolean>  вернуло true, то выполняется <оператор1>  для случая с одним оператором и <оператор1> , <оператор2> , … <операторN>  для случая блока операторов.

Примеры:

Согласно официальному соглашения о кодировании рекомендуется всегда использовать блок операторов, даже если оператор только один. Пример:

Синтаксис if-then-else :

Работает он так:

  1. Если <выражение_boolean>  вернуло true, то выполняется оператор или блок операторов внутри фигурных скобок, как и для if-then.
  2. Если <выражение_boolean>  вернуло false, то выполняется оператор или блок операторов в else.

Примеры:

Согласно соглашению о кодировании нужно всегда использовать вариант с блоком операторов (инструкций), даже если оператор только один, не смотря на то что компилятор позволяет в любом из кусков кода then  и else  использовать вариант с одним оператором и с блоком.

Можно в блоке else  проверить другое условие, тогда получится конструкция вида:

В конструкциях такого вида будет сначала проверяться условие в первом if  (в данном случае x < 0 ), если оно вернёт true, то выполнится его блок, если оно вернёт false, то будет проверяться следующее условие (в данном случае x == 3 ), если оно вернёт true, то выполнится его блок. Таким образом будут проверяться подряд все условия до такого условия, которое вернёт true. Если же ни одно из условий не вернёт true, то выполнится блок else  (если он есть, но его может не быть, тогда управление перейдёт дальше к следующему оператору за такой конструкцией).

Обратите внимание, что <выражение_boolean> может быть абсолютно любым выражением, возвращающим boolean, можно использовать даже операцию присвоения переменной логического типа, так как операция присвоения тоже возвращает значение:

Однако согласно соглашению о кодировании в Java использовать подобную возможность не стоит.

Оператор switch

Рассмотрим следующий кусок кода:

В куске кода, приведённом выше, проверяется значение переменной mode. Для значений 0, 1 и 2 предусмотрены отдельные блоки кода, и ещё один блок кода предусмотрен для всех остальных значений. Оператор switch  делает то же самое, но делает код более наглядным:

Этот кусок кода с оператором switch  делает абсолютно то же самое, что и кусок кода с if, рассмотренный до этого, но рекомендуется использовать вариант со switch, так как он более нагляден.

Оператор switch  работает в следующем порядке:

  1. Вычисляется выражение в скобках (в данном примере оно состоит просто из переменной mode )
  2. Полученное значение проверяется подряд со значениями в case , и выполняется тот блок операторов, который относится к case  со значением, совпадающим со значением выражения.
  3. Если ни одно из значений не совпало, то выполняется блок default.
  4. По ключевому слову break  выполнение блока внутри case  или default  завершается и управление передаётся на следующую инструкцию за блоком switch.

С помощью if-then  и if-then-else  можно проверять любые условия, но с помощью switch  можно проверять только значения выражений типа byte , short , char , int , перечисления (будет описано позднее), String (начиная с Java SE 7), а также классы java.lang.Byte , java.lang.Short , java.langCharacter , java.lang.Integer. Проверяемые значения в case  обязательно должны быть константными литералами. Если значение выражения в switch  равно null, то возникает java.lang.NullPointerException. Нагляднее всего switch  выглядит именно с перечислениями.

Ключевое слово break  не обязательно. В случае его отсутствия по завершении выполнения блока операторов внутри одного case  выполняются операторы следующего за ним case. Это позволяет использовать один блок операторов для нескольких значений case:

Если mode  равно 0, то код выше выведет в консоль:

Если mode  равно 1, то код выше выведет в консоль:

Если mode  равно 2, то код выше выведет в консоль:

Блок default  не обязательно указывать в конце блока switch. Он может стоять и в начале, и в середине (но рекомендуется всегда писать его последним, так получается гораздо нагляднее, потому что он выполняется в том случае, если ни один из case -ов не подошёл):

Можно даже вообще не указывать блок default:

Оператор while

Оператор while  позволяет выполнить инструкцию или блок инструкций несколько раз.

Его синтаксис:

И с блоком операторов/инструкций (согласно соглашению о кодировании Java рекомендуется использовать вариант с блоком даже в случае одной инструкции):

Оператор while  вычисляет выражение <условие>  и выполняет оператор или блок операторов, если результат выражения <условие>  равен true. Затем он ещё раз вычисляет и проверяет <условие>  и, если оно вернуло true, то снова выполняет оператор или блок операторов. Так выполняется до тех пор, пока <условие>  не вернёт false.

Следующий код выведет числа от 0 до 10:

Выражение <условие>  в while  может быть любым, но оно обязательно должно возвращать тип boolean. Следующий код тоже корректен:

Оператор do-while

Оператор do-while  похож на оператор while, но он сначала выполняет операторы, а лишь потом проверяет условие, таким образом оператор или блок операторов выполнятся хотя бы один раз.

Примеры:

Оператор for

Оператор for  представляет собой компактную форму итерации по диапазону чисел. Его синтаксис:

Или для блока операторов (согласно соглашению о кодировании в Java рекомендуется использовать этот вариант даже для случая одного оператора):

Выражение <инициализация>  выполняется только один раз перед началом итерации. Переменные, объявленные в <инициализация>  действуют только внутри цикла for , включая <инициализация> , <условие>  и <инкремент>.

Выражение <условие>  выполняется перед каждым циклом итерации. Блок операторов или одиночный оператор выполняются только тогда, когда <условие>  вернуло true . Если <условие>  возвращает false , то выполнение цикла for  завершается.

Выражение <инкремент>  выполняется после каждого цикла перед проверкой выражения <условие> . Его обычно используют для увеличения или уменьшения значения.

Любое из выражений <инициализация> , <условие> , <инкремент>  можно опустить. Можно даже вообще сделать цикл for  без инициализации, условия, инкремента и оператора/блока операторов:

Пример использования цикла for  для вывода значений от 0 до 10:

В <инициализация>  и в <инкремент>  можно указывать несколько выражений инициализации и несколько инкрементов. В этом случае они указываются через запятую и вычисляются слева направо:

Существует ещё специальная форма for для обхода по массивам и коллекциям:

Выведет в консоль следующее:

Оператор break

Оператор break  позволяет прервать текущее выполнение switch  или  цикла for , while  и do-while  и перейти к следующему оператору после него. Примеры:

Все приведённые выше примеры выводят в консоль числа от 0 до 10.

В случае вложенных циклов оператор break  прерывает выполнение самого глубокого из текущих циклов. Можно прервать внешний цикл, если указать для него метку:

Оператор continue

Оператор continue  позволяет пропустить текущую итерацию и перейти сразу к следующей итерации цикла for , while  или do-while. Он тоже бывает с меткой и без метки.

Пример без метки:

Выведет в консоль:

Пример с меткой:

Это выведет в консоль:

Оператор return

Оператор return  возвращает управление из текущего метода в метод, который вызвал текущий метод. Он имеет две формы: с возвращаемым значением и без.

С возвращаемым значением:

Пример:

И без возвращаемого значения (для метода с void ):

 

Цикл статей «Учебник Java 8».

Следующая статья — «Пакеты в Java 8».
Предыдущая статья — «Java 8 выражения, инструкции и блоки».


Поделиться: