- Branching Statements
- The continue Statement
- The return Statement
- Операторы break и continue — что это? Оператор break в Java
- Оператор break с меткой. Специфика использования. Ключевое слово goto
- В каких операторах используют оператор break?
- Оператор continue. Общая форма и особенности применения
- Оператор continue с меткой
- Когда применяют оператор continue?
- Преимущества использования операторов continue и break в программах
- Каковы отличия между break и continue при наличии метки?
- Примеры решения задач с break
Branching Statements
The break statement has two forms: labeled and unlabeled. You saw the unlabeled form in the previous discussion of the switch statement. You can also use an unlabeled break to terminate a for , while , or do-while loop, as shown in the following BreakDemo program:
class BreakDemo < public static void main(String[] args) < int[] arrayOfInts = < 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 >; int searchfor = 12; int i; boolean foundIt = false; for (i = 0; i < arrayOfInts.length; i++) < if (arrayOfInts[i] == searchfor) < foundIt = true; break; > > if (foundIt) < System.out.println("Found " + searchfor + " at index " + i); >else < System.out.println(searchfor + " not in the array"); >> >
This program searches for the number 12 in an array. The break statement, shown in boldface, terminates the for loop when that value is found. Control flow then transfers to the statement after the for loop. This program’s output is:
An unlabeled break statement terminates the innermost switch , for , while , or do-while statement, but a labeled break terminates an outer statement. The following program, BreakWithLabelDemo , is similar to the previous program, but uses nested for loops to search for a value in a two-dimensional array. When the value is found, a labeled break terminates the outer for loop (labeled «search»):
class BreakWithLabelDemo < public static void main(String[] args) < int[][] arrayOfInts = < < 32, 87, 3, 589 >, < 12, 1076, 2000, 8 >, < 622, 127, 77, 955 >>; int searchfor = 12; int i; int j = 0; boolean foundIt = false; search: for (i = 0; i < arrayOfInts.length; i++) < for (j = 0; j < arrayOfInts[i].length; j++) < if (arrayOfInts[i][j] == searchfor) < foundIt = true; break search; >> > if (foundIt) < System.out.println("Found " + searchfor + " at " + i + ", " + j); >else < System.out.println(searchfor + " not in the array"); >> >
This is the output of the program.
The break statement terminates the labeled statement; it does not transfer the flow of control to the label. Control flow is transferred to the statement immediately following the labeled (terminated) statement.
The continue Statement
The continue statement skips the current iteration of a for , while , or do-while loop. The unlabeled form skips to the end of the innermost loop’s body and evaluates the boolean expression that controls the loop. The following program, ContinueDemo , steps through a String , counting the occurrences of the letter «p». If the current character is not a p, the continue statement skips the rest of the loop and proceeds to the next character. If it is a «p», the program increments the letter count.
class ContinueDemo < public static void main(String[] args) < String searchMe = "peter piper picked a " + "peck of pickled peppers"; int max = searchMe.length(); int numPs = 0; for (int i = 0; i < max; i++) < // interested only in p's if (searchMe.charAt(i) != 'p') continue; // process p's numPs++; >System.out.println("Found " + numPs + " p's in the string."); > >
Here is the output of this program:
To see this effect more clearly, try removing the continue statement and recompiling. When you run the program again, the count will be wrong, saying that it found 35 p’s instead of 9.
A labeled continue statement skips the current iteration of an outer loop marked with the given label. The following example program, ContinueWithLabelDemo , uses nested loops to search for a substring within another string. Two nested loops are required: one to iterate over the substring and one to iterate over the string being searched. The following program, ContinueWithLabelDemo , uses the labeled form of continue to skip an iteration in the outer loop.
class ContinueWithLabelDemo < public static void main(String[] args) < String searchMe = "Look for a substring in me"; String substring = "sub"; boolean foundIt = false; int max = searchMe.length() - substring.length(); test: for (int i = 0; i > foundIt = true; break test; > System.out.println(foundIt ? "Found it" : "Didn't find it"); > >
Here is the output from this program.
The return Statement
The last of the branching statements is the return statement. The return statement exits from the current method, and control flow returns to where the method was invoked. The return statement has two forms: one that returns a value, and one that doesn’t. To return a value, simply put the value (or an expression that calculates the value) after the return keyword.
The data type of the returned value must match the type of the method’s declared return value. When a method is declared void , use the form of return that doesn’t return a value.
The Classes and Objects lesson will cover everything you need to know about writing methods.
Операторы break и continue — что это? Оператор break в Java
Оператор break применяется для прерывания текущей итерации (break (broke, broken) — ломать, разрывать). С его помощью происходит выход из блока фигурных скобок оператора цикла либо оператора switch с дальнейшей передачей управления следующему оператору. Если задействуются вложенные операторы, break обеспечивает выход из самого внутреннего оператора.
Общая форма оператора break (брейк) выглядит следующим образом:
Оператор break с меткой. Специфика использования. Ключевое слово goto
На практике оператор break с меткой применяется в качестве аналога оператора goto, который есть во многих языках программирования. В Java такой оператор не используется, однако само ключевое слово goto зарезервировано.
В общем виде оператор break выглядит так:
Здесь labelName — не что иное, как имя метки, соответствующее кодовому блоку. Под кодовым блоком понимается набор операторов, которые взяты в фигурные скобки < >.
Когда присутствует оператор break с меткой, осуществляется переход к метке для её реализации в программе.
В каких операторах используют оператор break?
Оператор break подходит для применения в операторе switch и во всех операторах цикла. Иными словами, break нельзя использовать за пределами цикла либо оператора switch.
Оператор continue. Общая форма и особенности применения
Оператор continue используется в циклах, обеспечивая переход в цикле к следующей итерации. Общая форма оператора выглядит соответствующим образом:
Как правило, continue вызывается в том случае, если достигнуто некоторое условие в теле цикла.
Оператор continue с меткой
Как и в случае с break, возможна реализация continue с меткой. В этом случае форма оператора будет выглядеть так:
Здесь labelName — это имя метки, соответствующей циклу, в котором как раз таки и реализован вызов посредством оператора continue.
Когда применяют оператор continue?
Оператор используют исключительно в циклах, то есть continue нельзя применять за их пределами.
Преимущества использования операторов continue и break в программах
Применение break и continue имеет следующие плюсы: — при выполнении циклического процесса отпадает необходимость осуществлять излишние итерации, если нужный результат достигнут либо искомое значение уже найдено. Всё это повышает скорость работы программного обеспечения; — в случае преждевременного прекращения циклического процесса структура кода не искажается.
Каковы отличия между break и continue при наличии метки?
Операторы continue/break с меткой используются в том случае, если в программе присутствуют вложенные циклы. При этом break с меткой обеспечивает полный выход изо всех вложенных циклов. А continue с меткой выходит из текущего вложенного цикла с последующим переходом к очередной итерации внешнего цикла.
Примеры решения задач с break
Пример 1. Давайте определим, есть ли отрицательное число в одномерном массиве:
int A[] = < 3, 5, -7, 20, 39, 12 >; boolean f_is = false; for (int i=0; i if (f_is) System.out.println("Да, в одномерном массиве есть отрицательное число."); else System.out.println("Отрицательное число отсутствует.");Пример 2. Давайте найдём, есть ли заданное число n в 2-мерном массиве, размер которого 2 х 3. Здесь break вызывается дважды: 1) когда требуется выйти из внутреннего цикла, в котором переменная j является итератором; 2) когда нужно покинуть внешний цикл, где итератором является переменная i.
int A[][] = < < 3, 5, -3 >, < 2, 8, 0 >>; boolean f_is = false; int n = 5; for (int i=0; i if (f_is) break; // выходим из внешнего цикла > if (f_is) System.out.println("Да, число есть в данном массиве."); else System.out.println("Нет, число отсутствует.");Очевидно, что если наш 2-мерный массив будет огромным по размеру, использование break повысит скорость выполнения циклического процесса.
Пример 3. Рассмотрим работу break с меткой. Здесь break работает так же, как и goto в других языках программирования. Как мы уже говорили, в Java это ключевое слово зарезервировано, однако вместо goto применяется оператор break с меткой и рядом ограничений.
Итак, задан 2-мерный массив целых чисел. Давайте определим, есть ли в нём отрицательные элементы:
// 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; i > if (f_is) System.out.println("В массиве A есть положительные элементы."); else System.out.println("Положительных элементов нет");В нашем случае перебор всех элементов 2-мерного массива производится в 2-х вложенных циклах. При этом перед вызовом циклов помещена метка M1. Если же в цикле нижнего уровня (счетчик j) встречается команда break M1, то производится выход с обоих циклов с последующим переходом к очередному оператору программы:
. if (f_is) System.out.println("В массиве A есть положительные элементы."); else System.out.println("В массиве A положительных элементов нет");А вот если M1 разместить непосредственно перед оператором if:
. M1: if (f_is) System.out.println("Есть положительные элементы."); else System.out.println("Положительных элементов нет");То компилятор в Java выдаст ошибку:
Unresolved compilation problem: The label M1 is missingА всё потому, что метка здесь может размещаться лишь перед тем циклом, в котором используется.