Привіт усім колегам і тим, хто просто цікавиться.
Сьогодні ми розглянемо таку можливість мови програмування Java як оператор переходу break. Це перша стаття на тему операторів переходу, тому якщо вам сподобається, буду радий написати ще. Відразу хочу зауважити, що ця стаття розрахована в першу чергу на розробників-початківців, і більш просунуті учні можуть не знайти тут чогось нового для себе. Тож поїхали. У Java існує 2 способи змінити порядок виконання інструкцій програми: оператори переходу та механізм обробки винятків. До операторів переходу в java відносять три оператори: break, continue та return. Сьогодні ж я пропоную Вам розглянути детальніше оператор
break
. Механізм обробки винятків є настільки великою темою, що виходить за межі цієї статті. Існують три способи застосування оператора break в java. Перший і найпопулярніший спосіб - використання break
для дострокового виходу з циклу, наприклад:
public class SimpleExample {
public static void main(String[] args) {
findNumberInLoop(3);
}
public static void findNumberInLoop(int number){
for (int i = 0; i < 10; i++) {
if (i == number) {
break;
}
System.out.println(i);
}
System.out.println("cycle was finished");
}
}
Цей приклад виведе на екран:
1
2
cycle was finished
Це означає, що коли лічильник циклу i
стає рівним переданому параметру number
, тобто числу 3 виконання циклу переривається достроково. Якщо в програмі є кілька вкладених один в одного циклів, то break виводить тільки з внутрішнього циклу, наприклад:
public class SimpleExample {
public static void main(String[] args) {
findNumberInLoop(3);
}
public static void findNumberInLoop(int number){
for(int i = 0; i < 5; i++) {
for (int j =0; j < 10; j++) {
if(j == number) {
break;
}
System.out.print(j);
}
System.out.println();
}
System.out.println("cycles was finished");
}
}
Цей приклад дає висновок:
012
012
012
012
012
cycles was finished
Як видно з прикладу, внутрішній цикл щоразу переривається на числі 3 (параметр number
), а зовнішній цикл виконується 5 разів, як було задумано. У java можна використовувати більше одного оператора break всередині циклу, але цього робити не рекомендується, тому що дуже погіршується читабельність і структура коду. Другий спосіб застосування break
полягає у використанні його для переривання виконання операторів у гілках switch
, наприклад:
public class SimpleExample {
public static void main(String[] args) {
square(2);
}
public static void square(int number){
switch (number){
case 1:
System.out.println(number*number);
break;
case 2:
System.out.println(number*number);
break;
case 3:
System.out.println(number*number);
break;
}
System.out.println("after switch");
}
}
Запуск цього прикладу дасть висновок:
4
after switch
Оператор break передав управління коду наступного за всім блоком switch
. Якщо ж не вказати break
в switch
цьому прикладі:
public class SimpleExample {
public static void main(String[] args) {
square(2);
}
public static void square(int number){
switch (number){
case 1:
System.out.println(number*number);
case 2:
System.out.println(number*number);
case 3:
System.out.println(number*number);
}
System.out.println("after switch");
}
}
Висновок буде не таким, як очікувалося:
4
4
after switch
Це сталося тому, що після виконання блоку case 2
програма продовжила виконувати всі наступні блоки case , що і дало нам відповідний висновок. Іноді така особливість оператора switch
може бути нам вигідна, наприклад:
public class SimpleExample {
public static void main(String[] args) {
compare(2);
compare(7);
compare(12);
}
public static void compare(int number){
switch (number){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("number is less than 5 or equal 5");
break;
case 6:
case 7:
case 8:
case 9:
System.out.println("number is greater than 5");
break;
default:
System.out.println("number is less than 0 or greater than 9");
}
System.out.println("after switch");
}
}
Ця програма реалізує порівняння заданого числа з числом 5 і дає такий висновок:
after switch
number is greater than 5
after switch
number is less than 0 or greater than 9
after switch
При першому виклику методу оператор switch
передає управління оператору case 2
і далі до оператора break
в case 5
. Другий виклик відбувається за аналогією з першим, але починається з case 7
. Третій виклик не знаходить відповідного значення серед усіх case'ів, тому виконується оператор default
. Третій спосіб полягає у використанні оператора break
замість оператора goto
з мови C. Для цього ми будемо використовувати особливу форму оператора break
, яку називають break
міткою. Ця форма виглядає як break метка;
Мітка - це як правило будь-яке ім'я, що підходить з простору імен java, що передує блок коду. При цьому після застосування цього блоку кодуbreak
з міткою призведе до того, що код продовжить виконуватися з місця після блоку з відповідною міткою, наприклад:
public class SimpleExample {
public static void main(String[] args) {
howWeUseLabels(true);
System.out.println();
howWeUseLabels(false);
}
public static void howWeUseLabels(boolean bool) {
firstBlock:{
secondBlock:{
thirdBlock:{
System.out.println("We will see it always");
if(bool) {
break secondBlock;
}
System.out.println("We won't see it if bool == true");
}
System.out.println("We won't see it if bool == true");
}
System.out.println("We will see it always");
}
}
}
Цей приклад дасть такий висновок:
We will see it always
We will see it always
We will see it always
We won't see it if bool == true
We won't see it if bool == true
We will see it always
Після першого виклику методу, оператор break
здійснює передачу управління в кінець блоку secondBlock
, виходячи з secondBlock
і thirdBlock
при цьому виконуючи ще один оператор println()
, в кінці firstBlock
. Після другого дзвінка на екран виводиться усі рядки. Мітки можна використовувати також для позначення циклів. При цьому слід пам'ятати, що переходити до мітки можна лише зсередини блоку коду, позначеного міткою, наприклад, такий код не скомпілюється:
public class SimpleExample {
public static void main(String[] args) {
label:{
System.out.println("inside label");
}
if(true) {
break label;
}
System.out.println("This is error");
}
}
Зауваження щодо чистоти коду та оператора break
: Існує загальновизнана рада використовувати оператор break
дуже обережно, оскільки застосування break
ускладнює розуміння циклу та змушує програміста заглянути всередину циклу, щоб розібратися в нюансах його роботи. Є евристичні правила, що використовувати break
можна впевненіше в більш коротких циклах і з більшою обережністю в довгих і мають глибоку вкладеність, так як це збільшує ймовірність помилки і ускладнює читання та розуміння вашого коду іншими програмістами. Як я вже писав вище, використання великої кількостіbreak
, Розкиданий по всьому коду, говорить про те, що програміст не до кінця розуміє, чому він написав свій код саме так. Можливо, варто розглянути рефакторинг такого циклу шляхом розбиття на кілька більш маленьких циклів. Намагайтеся обережно використовувати break
з міткою як заміну goto
, оскільки це ускладнює структуру коду. Ось і все, що я хотів сьогодні розповісти про оператора break
в java. Буду радий конструктивній критиці, а також готовий написати продовження про операторів continue
і return
, якщо Вам це цікаво.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ