Назад Зміст Вперед

Урок 3.6. Оператори break, continue, return. Метод System.exit()

Досить часто вимагається при виконанні будь-якої умови перервати цикл або підпрограму і перейти до виконання іншого алгоритму або чергової ітерації циклу. При неструктурному програмуванні для цих цілей служив оператор goto. У Java є гнучкіші і структурні засоби для вирішення цих проблем - оператори continue, break, return, System.exit:
  • continue; - переривання виконання тіла циклу і перехід до наступної ітерації (перевірці умови) поточного циклу;
  • continue ім'я мітки; - переривання виконання тіла циклу і перехід до наступної ітерації (перевірці умови) циклу, поміченого міткою ( label );
  • break; - вихід з поточного циклу;
  • break ім'я мітки; - вихід з циклу, поміченого міткою;
  • return; - вихід з поточної підпрограми (у тому числі з тіла циклу) без повернення значення;
  • return значення; - вихід з поточної підпрограми (у тому числі з тіла циклу) з поверненням значення;
  • System.exit (n) - вихід з додатка з кодом завершення n. Ціле число n довільно задається програмістом. Якщо n=0, вихід вважається нормальним, в інших випадках - аварійним. Додаток перед завершенням повідомляє число n операційній системі для того, щоб програміст міг встановити, з якої причини стався аварійний вихід.
  • без міток для виходу з поточного (самого внутрішнього по вкладеності) циклу, і 
  • з міткою - для виходу з поміченого їй циклу. Міткою є ідентифікатор, після якого стоїть двокрапка. Мітку можна ставити безпосередньо перед ключовим словом, яким розпочинається цикл ( for, while, do ).
Оператори continue і break використовуються в двох варіантах: 


1. Приклад використання continue без мітки:
for(int i=1;i<=10;i++){ if(i==(i/2)*2){ }; continue; }; System.out.println("i="+i);
У цьому циклі не друкуватимуться усі значення i, для яких i== (i/2) *2. Тобто, виводитися у вікно консолі будуть тільки непарні значення i.

Ще один приклад використання continue без мітки:
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){ continue; if(i*j==(i*j/2)*2){ }; System.out.println("i="+i+" j="+j+ " 1.0/(i*j-20)="+ (1.0/(i*j-20)) ); }; };
В цьому випадку виводитимуться значення i, j та 1.0/ (i*j - 20) для усіх непарнихi та j від 1 до 19. Тобто, будуть пропущені значення для усіх парних i та j:
i=1 j=1 1.0/(i*j-20)=-0.05263157894736842 i=1 j=3 1.0/(i*j-20)=-0.058823529411764705 i=1 j=5 1.0/(i*j-20)=-0.06666666666666667 i=1 j=9 1.0/(i*j-20)=-0.09090909090909091 i=1 j=7 1.0/(i*j-20)=-0.07692307692307693 i=1 j=11 1.0/(i*j-20)=-0.1111111111111111 i=1 j=17 1.0/(i*j-20)=-0.3333333333333333 i=1 j=13 1.0/(i*j-20)=-0.14285714285714285 i=1 j=15 1.0/(i*j-20)=-0.2 i=1 j=19 1.0/(i*j-20)=-1.0 i=3 j=7 1.0/(i*j-20)=1.0 i=3 j=1 1.0/(i*j-20)=-0.058823529411764705 i=3 j=3 1.0/(i*j-20)=-0.09090909090909091 i=3 j=5 1.0/(i*j-20)=-0.2 ... i=19 j=15 1.0/(i*j-20)=0.0037735849056603774 i=19 j=9 1.0/(i*j-20)=0.006622516556291391 i=19 j=11 1.0/(i*j-20)=0.005291005291005291 i=19 j=13 1.0/(i*j-20)=0.004405286343612335 i=19 j=19 1.0/(i*j-20)=0.002932551319648094 i=19 j=17 1.0/(i*j-20)=0.0033003300330033004
2. Приклад використання continue з міткою:
label_for1:for(int i=1;i<=20;i++){ for(int j=1;j<=20;j++){ continue label_for1; if(i*j==(i*j/2)*2){ }; System.out.println("i="+i+" j="+j+ " 1.0/(i*j-20)="+ (1.0/(i*j-20)) ); }; };
На відміну від попереднього випадку, після кожного досягнення рівності i*j== (i*j/2) *2 робитиметься вихід з внутрішнього циклу (по j), і всі подальші j для таких значень i будуть пропущені. Тому будуть виведені тільки значення
i=1 j=1 1.0/(i*j-20)=-0.05263157894736842 i=3 j=1 1.0/(i*j-20)=-0.058823529411764705 i=5 j=1 1.0/(i*j-20)=-0.06666666666666667 i=9 j=1 1.0/(i*j-20)=-0.09090909090909091 i=7 j=1 1.0/(i*j-20)=-0.07692307692307693 i=11 j=1 1.0/(i*j-20)=-0.1111111111111111 i=17 j=1 1.0/(i*j-20)=-0.3333333333333333 i=13 j=1 1.0/(i*j-20)=-0.14285714285714285 i=15 j=1 1.0/(i*j-20)=-0.2 i=19 j=1 1.0/(i*j-20)=-1.0
3. Приклад використання break без мітки:
for(int i=1;i<=10;i++){
    if( i+6== i*i ){
        break;
    };
    System.out.println("i="+i);
};
Цей цикл зупиниться при виконанні умови i+6== i*i. Тобто, виведення у вікно консолі буде тільки для значень i, рівних 1 і 2.
Ще один приклад використання break без мітки:
for(int i=1;i<=20;i++){ for(int j=1;j<=20;j++){ break; if(i*j==(i*j/2)*2){ }; System.out.println("i="+i+" j="+j+ " 1.0/(i*j-20)="+ (1.0/(i*j-20)) ); }; };
В цьому випадку виводитимуться усі значення i і j до тих пір, поки не знайдеться пара i і j, для яких i*j== (i*j/2) *2. Після чого внутрішній цикл припиняється - значення i, j і 1.0/ (i*j - 20) для даного і подальших значень j при відповідному i не виводитимуться у вікно консолі. Але зовнішній цикл (по i) триватиме, і виведення продовжиться для нових i і j. Результат буде таким же, як для continue з міткою для зовнішнього циклу.

4. Приклад використання break з міткою:

label_for1:for(int i=1;i<=20;i++){ for(int j=1;j<=20;j++){ break label_for1; if(i*j==(i*j/2)*2){ }; System.out.println("i="+i+" j="+j+ " 1.0/(i*j-20)="+ (1.0/(i*j-20)) ); }; };
В цьому випадку також виводитимуться усі значення i і j до тих пір, поки не знайдеться пара i і j , для яких i*j== (i*j/2) *2. Після чого припиняється зовнішній цикл, а значить - і внутрішній теж. Виведення у вікно консолі припиниться. Тому вивід буде тільки для i=1, j=1

Отже, у Java є: 

1. умовний оператор if, оператор вибору switch, умовне вираження .?... :, оператори інкремента ++ і декремента --

 2. оператори циклу: for, while - цикл з передумовою, do...while - цикл з післяумовою. А також оператори переривання циклів continue і break, підпрограм - return, програми - System.exit.





.