Операторы break , continue . Примеры использования
Оператор break осуществляет выход из блока фигурных скобок оператора цикла или оператора switch и передает управление следующему оператору в программе. Если используются вложенные операторы, то оператор break осуществляет выход из самого внутреннего оператора.
Общая форма оператора break следующая
2. Оператор break с меткой. Особенности применения. Ключевое слово goto
Оператор break с меткой может применяться как аналог оператора goto , который присутствует в других языках программирования. В языке Java оператор goto не используется. Однако, ключевое слово goto есть зарезервированным.
Общая форма оператора break с меткой имеет следующий вид:
break labelName;
где labelName – это метка, которая соответствует кодовому блоку. Кодовый блок – это набор операторов, взятых в фигурные скобки .
Если в программе встречается оператор break с меткой, то происходит переход к метке, которая должна быть реализована в программе.
Общая форма объявления метки следующая
labelName: < // последовательность операторов // . >
где labelName – имя метки. Имя метки задается также как и для любого идентификатора.
3. В каких операторах можно использовать оператор break ?
Оператор break можно использовать во всех операторах цикла и операторе switch . Другими словами, оператор break не может быть использован за пределами цикла или оператора switch .
4. Оператор continue . Особенности применения. Общая форма
Оператор continue применяется в циклах . Оператор continue обеспечивает переход к следующей итерации в цикле.
Общая форма оператора continue имеет вид:
Чаще всего оператор continue вызывается при достижении некоторого условия в теле цикла.
5. Оператор continue с меткой
Оператор continue может быть реализован с меткой. В этом случае общая форма оператора continue следующая
continue labelName;
где labelName – имя метки, которая соответствует циклу, в котором реализован вызов с помощью оператора continue .
6. В каких операторах можно применять оператор continue ?
Оператор continue можно применять только в циклах. Другими словами, оператор continue нельзя применять за пределами цикла.
7. Примеры решения задач, в которых используется оператор break
Пример 1. Определение наличия отрицательного числа в одномерном массиве.
// Определение наличия отрицательного числа в одномерном массиве int A[] = < 3, 5, -7, 20, 39, 12 >; boolean f_is = false; for (int i=0; ilength; i++) if (A[i]<0) // есть ли отрицательное число в массиве? < f_is = true; // если есть, то решение найдено break; // выход из цикла, дальнейшее выполнение цикла не имеет смысла > if (f_is) System.out.println("Отрицательное число есть в массиве."); else System.out.println("Отрицательного числа нет в массиве.");
Пример 2. Определение наличия заданного числа n в двумерном массиве размером 2*3. В данном примере оператор break вызывается два раза. Первый раз, когда нужно выйти из внутреннего цикла, в котором переменная j есть итератором. Второй раз, когда нужно выйти из внешнего цикла, в котором переменная i есть итератором.
// Определение наличия отрицательного числа в одномерном массиве int A[][] = < < 3, 5, -3 >, < 2, 8, 0 >>; boolean f_is = false; int n = 5; for (int i=0; ilength; i++) < for (int j=0; jlength; j++) if (A[i][j]==n) < f_is = true; // если число найдено, то выход из внутреннего цикла break; // дальнейшее выполнение не имеет смысла > if (f_is) break; // выход из внешнего цикла > if (f_is) System.out.println("Число есть в массиве."); else System.out.println("Числа нет в массиве.");
Если двумерный массив есть большим по размеру, то использование оператора break повышает скорость выполнения цикла.
8. Пример использования оператора break с меткой
Оператор break с меткой работает так же, как и оператор goto в других языках программирования. В языке Java оператор goto не используется. Однако, ключевое слово goto зарезервировано. Вместо goto используется оператор break с меткой с некоторыми ограничениями.
Задан двумерный массив целых чисел. Определить, есть ли в массиве отрицательные элементы. Ниже приведен фрагмент кода, решающий данную задачу.
// Оператор break с меткой int[][] A = < < 2, 5, 8, >, < 3, -7, 4 >, < -2, 1, 3 >, < -4, 2, 3 >>; boolean f_is = false; // метка с именем M1 M1: for (int i=0; ilength; i++) for (int j=0; jlength; j++) < k++; if (A[i][j]<0) < f_is = true; break M1; // полное завершение цикла, переход к следующему оператору // continue M1; - переход к следующей итерации внешнего цикла (счетчик i) > > if (f_is) System.out.println("В массиве A есть положительные элементы."); else System.out.println("В массиве A положительных элементов нет");
Перебор всех элементов двумерного массива осуществляется в двух вложенных циклах. Перед вызовом циклов помещена метка с именем M1 . Если в цикле нижнего уровня (счетчик j ) встречается команда
то происходит выход с обоих циклов и переход к следующему оператору программы:
. if (f_is) System.out.println("В массиве A есть положительные элементы."); else System.out.println("В массиве A положительных элементов нет");
Если метку M1 разместить перед оператором if , например:
. M1: if (f_is) System.out.println("В массиве A есть положительные элементы."); else System.out.println("В массиве A положительных элементов нет");
то компилятор Java сгенерирует ошибку
Unresolved compilation problem: The label M1 is missing
так как в операторе break с меткой, метка может размещаться только перед циклом, в котором она используется.
9. Примеры решения задач, в которых используется оператор continue
Пример 1. Дано n . Написать фрагмент программного кода, который вычисляет следующую сумму S = 2 + 4 + … + 2·n .
Существует много способов решения данной задачи. В данном случае задача решается с использованием оператора continue .
int s=0; int n; n = 10; for (int i=1; i if (i%2==1) continue; // нечетные значения i пропустить s = s+i; // суммировать только парные значения i >
if (i%2==1) continue;
проверяется значение i . Если i нечетно ( i%2==1 ), то происходит переход на следующую итерацию с помощью оператора continue . Таким образом, суммируются только парные значения i .
Пример 2. В заданном массиве чисел все положительные элементы умножить на 2. Для решения используется оператор continue .
// использование оператора continue double[] A = < 3.8, -2.5, 4.6, -1.8, -2.2, 5.6, 1.5 >; // в массиве A все положительные элементы умножить на 2 for (int i=0; ilength; i++) < // если элемент массива отрицательный, то переход к следующей итерации if (A[i]<0) continue; // иначе, умножить этот элемент на 2 A[i] = A[i] * 2; >
10. Примеры решения задач, в которых используется оператор continue с меткой
Пример 1. Демонстрируется использование оператора continue с меткой, которая размещена во вложенном цикле (внутреннем цикле). Метка имеет имя loop . В примере находится сумма элементов, которые размещены на главной диагонали матрицы A размера 5×5.
// суммировать элементы матрицы, которые размещены на главной диагонали // в этих элементах позиция в строке i равна позиции в столбце j int n = 5; // размерность матрицы double A[][] = < < 3.2, 4.1, 2.8, 3.4, 3.4 >, < 1.3, 4.3, 5.5, 0.4, 1.4 >, < 3.4, 4.7, 2.1, 3.4, 3.4 >, < 6.2, 4.1, 2.6, 2.4, 2.4 >, < 0.7, 7.1, 3.8, 1.4, 4.4 >>; double summ = 0; // во внутреннем цикле объявляется метка с именем loop for (int i=0; i for (int j=0; j // если не главная диагональ, то переход на следующую итерацию if (i!=j) continue loop; summ += A[i][j]; >
Пример 2. Демонстрируется использование оператора continue с меткой, которая размещена на внешнем (верхнем) цикле. В программе определяется количество строк массива A , в которых есть отрицательные элементы.
// суммировать элементы матрицы, которые размещены на главной диагонали // в этих элементах позиция в строке i равна позиции в столбце j int n = 0; // количество строк, в которых есть отрицательные элементы double A[][] = < < 3.2, -4.1, 2.8, 3.4, 3.4, 3.6, 4.8 >, < 1.3, 4.3, 5.5, 0.4, 1.4, 2.0, 1.0 >, < 3.4, -4.7, 2.1, -3.4, 3.4, 3.0, 5.5 >, < 6.2, 4.1, 2.6, 2.4, 2.4, 1.8, 1.9 >, < -0.7, 7.1, 3.8, 1.4, 4.4, 2.3, 4.0 >>; // объявляется метка с именем nextRow nextRow: for (int i=0; ilength; i++) for (int j=0; jlength; j++) < // если найден отрицательный элемент, то переход на следующую строку массива if (A[i][j]<0) < n++; // увеличить счетчик continue nextRow; > > System.out.println("n color: #008000;">// n = 3
Перебор всех элементов массива осуществляется с помощью двух вложенных циклов. Номер строки соответствует переменной i , номер столбца соответствует переменной j .
Если в i -й строке массива найден хотя бы один отрицательный элемент, то дальнейший перебор элементов этой строки не имеет смысла. Нужно переходить на следующую строку. Именно поэтому, здесь вызывается оператор continue с меткой, которая размещается на верхнем (внешнем цикле). Метка имеет название nextRow .
11. Какие преимущества дает использование операторов break и continue в программах
Использование break и continue дает следующие преимущества:
- в случае выполнения циклического процесса нет необходимости выполнять лишние итерации, если найдено искомое значение или достигнут нужный результат. Это дает повышение скорости выполнения программы;
- при преждевременном прекращении циклического процесса не искажается структура кода.
12. Какое отличие между оператором break с меткой и оператором continue с меткой
Операторы break с меткой и continue с меткой могут использоваться только тогда, когда в программе есть вложенные циклы. Оператор break с меткой осуществляет полный выход из всех вложенных циклов. Оператор continue с меткой осуществляет выход из текущего вложенного цикла и переход к следующей итерации внешнего цикла.
Операторы перехода break, continue, return
В Java есть три оператора перехода: break, continue, return. Операторы перехода передают управление другой части программы.
Оператор break
Оператор break завершает последовательность операторов в операторе switch, позволяет выйти из цикла и в качестве оператора безусловного перехода (goto).
Рассмотрим пример выхода из цикла. Используя оператор break, можно вызвать немедленное завершение цикла, пропуская условное выражение и другой код в теле цикла. Когда приложение встречает оператор break внутри цикла, оно прекращает выполнение цикла и передаёт управление оператору, следующему за циклом.
for(int i = 0; i < 100; i++) < if(i == 5) break; // выходим из цикла, если i равно 5 mInfoTextView.append("i: " + i + "\n"); >mInfoTextView.append("Цикл завершён");
Получим следующий результат:
i: 0 i: 1 i: 2 i: 3 i: 4 Цикл завершён
Вроде хотели, чтобы цикл for выполнялся от 0 до 100, а сами коварно вышли из него, когда значение переменной i стало равным 4.
Код можно переписать с использованием цикла while:
int i = 0; while(i < 100) < if(i == 5) break; // выходим из цикла, если i равно 5 mInfoTextView.append("i: " + i + "\n"); i++; >mInfoTextView.append("Цикл завершён");
При использовании вложенных циклов оператор break осуществляет выход только из самого внутреннего цикла, не оказывая влияния на внешний цикл. Создадим пример с использованием вложенных циклов:
for (int i = 1; i < 4; i++) < mInfoTextView.append("Проход " + i + ": "); for (int j = 0; j < 100; j++) < if (j == 5) break; // выходим из цикла, если j равно 5 mInfoTextView.append(j + " "); >mInfoTextView.append("\n"); > mInfoTextView.append("Циклы завершёны");
Получим следующий результат:
Проход 1: 0 1 2 3 4 Проход 2: 0 1 2 3 4 Проход 3: 0 1 2 3 4 Циклы завершёны
В примере оператор break прервал выполнение второго цикла, но первый цикл продолжал работать.
В цикле можно использовать несколько операторов break, но увлекаться не стоит. Лучше переделайте код.
break как замена goto
В Java нет оператора безусловного перехода goto. Если вы не знаете, что это такое, то можете смело пропустить данный абзац. У оператора break есть особая форма записи:
Обычно метка — это имя метки, идентифицирующей блок кода. Я ни разу не встречал в реальных примерах данный способ, поэтому не буду приводить пример использования, чтобы вас не запутать.
Оператор continue
Иногда требуется, чтобы повторение цикла начиналось с более раннего оператора его тела. В циклах while и do-while оператор continue вызывает передачу управления непосредственно управляющему условному выражению цикла. В цикле for управление передаётся вначале итерационной части цикла for, а потом условному выражению. При этом во всех циклах промежуточный код пропускается.
В следующем примере выводим два числа в каждой строке:
В этом коде оператор % служит для проверки чётности значения переменной i. Если значение чётное, выполнение цикла продолжится дальше, а если нечётное, то произойдёт переход на новую строку. В результате мы получим следующий текст:
Как и оператор break, оператор continue может содержать метку содержащего его цикла, который нужно продолжить. Создадим пример вывода треугольной таблицы умножения чисел от 0 до 9.
outer: for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < if (j >i) < mInfoTextView.append("\n"); continue outer; >mInfoTextView.append(" " + (i * j)); > > mInfoTextView.append("\n");
В этом примере оператор continue прерывает цикл подсчёта значений переменной j и продолжает его со следующей итерации цикла подсчёта переменной i. На экране увидим текст в таком виде:
0 0 1 0 2 4 0 3 6 9 0 4 8 12 16 и т.д.
Данный оператор в практике встречается достаточно редко. Но на всякий случай помните о нём. Иногда он может пригодиться.
Оператор return
Оператор return используют для выполнения явного выхода из метода. Оператор можно использовать в любом месте метода для возврата управления тому объекту, который вызвал данный метод. Таким образом, return прекращает выполнение метода, в котором он находится.