Как прервать работу программы в java

Оператор break осуществляет выход из блока фигурных скобок оператора цикла или оператора switch и передает управление следующему оператору в программе. Если используются вложенные операторы, то оператор break осуществляет выход из самого внутреннего оператора.

Общая форма оператора break следующая

break;

2. Оператор break с меткой. Особенности применения. Ключевое слово goto

Оператор break с меткой может применяться как аналог оператора goto , который присутствует в других языках программирования.

В языке Java оператор goto не используется. Однако, ключевое слово goto есть зарезервированным.

Общая форма оператора break с меткой имеет следующий вид:

break labelName;

где labelName – это метка, которая соответствует кодовому блоку. Кодовый блок – это набор операторов, взятых в фигурные скобки .

Если в программе встречается оператор break с меткой, то происходит переход к метке, которая должна быть реализована в программе.

Общая форма объявления метки следующая

Java с нуля #32 — Конструкция while


labelName: < // последовательность операторов // . >

где labelName – имя метки. Имя метки задается также как и для любого идентификатора.

3. В каких операторах можно использовать оператор break ?

Оператор break можно использовать во всех операторах цикла и операторе switch . Другими словами, оператор break не может быть использован за пределами цикла или оператора switch .

4. Оператор continue . Особенности применения. Общая форма

Оператор 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 вызывается два раза.

Java Core July: Thread. Лекция #14 (Часть 2)

Первый раз, когда нужно выйти из внутреннего цикла, в котором переменная 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 положительных элементов нет»);

Читайте также:
Dwl формат какой программы

Перебор всех элементов двумерного массива осуществляется в двух вложенных циклах. Перед вызовом циклов помещена метка с именем 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(«В массиве 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 с меткой осуществляет выход из текущего вложенного цикла и переход к следующей итерации внешнего цикла.

Источник: www.bestprog.net

Java. Остановись задача

Вот уже почти год как усиленно занимаюсь коддингом на Java. Столкнулся с довольно серьезной на мой взгляд проблемой, связанных с многопоточностью, как мне кажется, неразрешимой в рамках текущей реализации JVM от Oracle (сказанное относится к JDK 1.5 и выше). Дело в том, что на данный момент в Java нет возможности гарантированно безопасно остановить выполнение какого-либо потока. Данный пост разъясняет почему это именно так и предлагает начать дискуссию о способах решения этой проблемы.

Казалось бы тривиальная задача: имеем некий Thread (поток), который, мы точно знаем, безнадежно завис (может зациклился, может, что-то еще), при этом потребляет некоторые ресурсы. Что нам с ним делать? Хотелось бы ресурсы наши освободить. Казалось бы, что проще? Ан нет, при детальном изучении вопроса оказалось, что в JVM просто нет инструкции, чтобы корректно остановить зависший Thread.

Старый метод Thread.stop() объявлен Deprecated и предан строжайшей анафеме. Как сказано в javadoc’е это метод «по сути небезопасен». Ну что же, если не безопасен не будем его использовать, дайте нам другой, безопасный метод. Но другого безопасного как ни странно не предлагается. Предлагается, безусловно, очень безопасная инструкция Thread.interrupt().

Но безопасна она, к сожалению, потому, что ровным счетом ничего не делает! Это всего лишь сообщение потоку: «Пожалуйста, остановись». Но если поток данное сообщение проигнорировал то… как сказано в документации «Если поток не отвечает на Thread.interrupt() вы можете использовать специфические для вашего приложению трюки». Спасибо, что разрешили. Что называется, крутись как хочешь.

Все становится еще сложней, если задача запущена в пуле потоков, через, например, ExecutorService.submit(Runnable). При этом мы даже не знаем, в каком именно потоке данная задача выполняется и уже не может применить даже запрещенный Thread.stop(). С другой стороны, мы имеем ссылку на Future, а у Future есть метод Future.cancel(boolean), который должен отменить выполнение задачи. Но если задача уже начала выполняться, вызов Future.cancel(true) на самом деле не остановит ее. В недрах реализации FutureTask выполняется код:

if (mayInterruptIfRunning) Thread r = runner;
if (r != null)
r.interrupt(); >

Т.е. опять потоку, в котором выполняется задача, всего лишь рекомендуется прекратить выполнение. К тому же, мы не имеем даже возможности узнать выполняется ли задача в данный момент или нет. Есть, вроде, метод Future.isDone(), но опять мимо, он возвращает true не только когда задача завершила выполнение, а сразу после вызова Future.cancel(), даже если задача все еще выполняется (ведь Future.cancel(true) не останавливает задачу которая уже начала выполняться).

Хорошо, если мы сами пишем весь код, тогда можно в нужных местах аккуратно обрабатывать Thread.isInterrupted() и все будет ОК. Но если мы запускаем сторонний код? Если у нас есть сервер расширяемый с помощью плагинов? Какой-нибудь криво написанный плагин может запросто привести к неработоспособному состоянию весь сервер ведь мы не можем корректно прервать выполнение зависшего плагина.

Признаюсь, я не знаю удовлетворительного решения. Может быть, метод Thread.stop() не так уж опасен? Очень хотелось бы услышать мнения Java программистов практиков по этому поводу.

Читайте также:
Какие программы для кфх

Источник: habr.com

Оператор break в Java

Если Вы уже сталкивались с циклами, то Вы уже знаете, что все они, чаще всего, имеют одинаковые составляющие:

  • переменную итерации
  • условие
  • шаг итерации

For, while, do. while выполняют одинаковые функции. Можно сказать, что циклы достаточно простые и предсказуемые — они просто изменяют заданную переменную n-ное количество раз.

Но существуют ключевые слова, которые дают нам больше власти над циклом. Они позволяют нам:

  • завершить цикл раньше времени (оператор break)
  • проигнорировать часть кода (оператор continue)

В некоторых ситуациях они позволят Вам найти более практичное и элегантное решение поставленных задач. Давайте рассмотрим их подробнее.

Также к операторам перехода относится ключевое слово return, но для его изучения Вам нужно продвинуться чуть-чуть дальше в нашем самоучителе. Поэтому, в этой статье про него рассказывать не будем. Вы узнаете о нем немного позже.

Оператор break

С английского «break» переводится как «останавливать, прерывать». Как уже было сказано выше, оператор break позволяет прервать выполнение цикла в любой удобный для программиста момент — раньше, чем цикл «должен был бы» завершиться. Примерно вот так:

Синтаксис

Записывается оператор break так:

Как видите, никаких скобочек, точечек или чего-нибудь еще — просто ключевое слово «break», а потом точка с запятой. Сказал как «остановил»:)

Оператор break для выхода из цикла

В цикле (например, в цикле while) он будет выглядеть так:

class Test <
public static void main ( String args [ ] ) <
while ( i < = 5 ) <
System . out . println ( i + «: цикл выполняется!» ) ;

Итак, что тут происходит?

Тут у нас есть цикл while, который стандартно должен был бы выполняться пять раз. Проверим это. Вот код без оператора break:

class Test <
public static void main ( String args [ ] ) <
while ( i < = 5 ) <
System . out . println ( i + «: цикл выполняется!» ) ;

в консоли мы бы получили:

1: цикл выполняется!
2: цикл выполняется!
3: цикл выполняется!
4: цикл выполняется!
5: цикл выполняется!

Но потом мы добавляем оператор if. Мы решили, что если переменная i станет равна переменной а, (т.е. станет равна трем) нам нужно остановить цикл. Таким образом, мы написали:

В итоге, в консоле мы получили:

1: цикл выполняется!
2: цикл выполняется!
3: цикл выполняется!

То-есть когда переменная i приобрела значение 3, цикл завершился. Точно так же оператор break будет работать и с любыми другими циклами — for, do. while и так далее. просто вставьте эти строчки в нужный цикл:

Оператор break для выхода из цикла: вложенные циклы

Но тут может возникнуть вопрос — что будет, если циклов не один, а несколько? И как будет работать такой код:

class Test <
public static void main ( String args [ ] ) <
for ( int i = 1 ; i < = 3 ; i ++ ) <
System . out . println ( «Это первый цикл! Я выполняюсь » + i + » раз» ) ;
for ( int a = 1 ; a < = 10 ; a ++ ) <
System . out . println ( » Это второй цикл! Я выполняюсь » + a + » раз» ) ;

Вы видите два цикла for. Во втором, «внутреннем» цикле, находится оператор break. Итак, когда выполнится условие — а именно когда а будет равен двум — остановится только второй цикл, или оба? Чтобы понять, давайте посмотрим, что покажет консоль.

Итак, в результате имеем:

Это первый цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз
Это первый цикл! Я выполняюсь 2 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз
Это первый цикл! Я выполняюсь 3 раз
Это второй цикл! Я выполняюсь 1 раз
Это второй цикл! Я выполняюсь 2 раз

Как видите, первый цикл выполняется 3 раза, как и должен был. При этом, второй цикл — каждый раз только два раза. А это значит, что оператор break прерывает только один цикл — тот, который его непосредственно вызывает.

Оператор break и оператор switch

И на последов, есть еще одно применение оператора break. Если Вы читали статью нашу статью про оператор switch:

то Вы могли уже встречать оператор break. Вот пример из той статьи:

Источник: vertex-academy.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru