JavaRush /Java блог /Random UA /Оператор break в Java
iloveski
37 рівень
Москва

Оператор break в Java

Стаття з групи Random UA
Привіт усім колегам і тим, хто просто цікавиться.
Оператор break в Java - 1
Сьогодні ми розглянемо таку можливість мови програмування 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, якщо Вам це цікаво.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ