Как я могу выйти из блока try / catch без исключения в Java - PullRequest
50 голосов
/ 30 июня 2011

Мне нужен способ пробиться с середины блока try / catch без исключения. Что-то похожее на разрыв и продолжение цикла. Возможно ли это?

Я получаю странные сообщения о создании пользовательского исключения (с именем «BreakContinueException»), которое просто ничего не делает в своем обработчике catch. Я уверен, что это очень искажено.

Итак, какое-нибудь прямое решение, о котором я не знаю?

Ответы [ 7 ]

47 голосов
/ 30 июня 2011

Правильный способ сделать это, вероятно, разбить метод, поместив блок try-catch в отдельный метод, и использовать оператор return:

public void someMethod() {
    try {
        ...
        if (condition)
            return;
        ...
    } catch (SomeException e) {
        ...
    }
}

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

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}
28 голосов
/ 30 июня 2011

Вы всегда можете сделать это с break из конструкции цикла или с пометкой break как указано в ответе aioobies.

public static void main(String[] args) {
    do {
        try {
            // code..
            if (condition)
                break;
            // more code...
        } catch (Exception e) {

        }
    } while (false);
}
12 голосов
/ 30 июня 2011

Различные способы:

  • return
  • break или continue в цикле
  • break для метки в помеченном выражении (см. Пример @ aioobe)
  • break в выражении switch.

...

  • System.exit() ... хотя это, вероятно, не то, что вы имеете в виду.

По моему мнению, "break to label" - самый естественный (наименее искаженный) способ сделать это, если вы просто хотите выйти из попытки / улова. Но это может сбить с толку начинающих Java-программистов, которые никогда не сталкивались с этой конструкцией Java.

Но хотя метки неясны, по моему мнению, оборачивать код в do ... while (false), чтобы вы могли использовать break, - более плохая идея. Это запутает не новичков, а также новичков. Новичкам (и не новичкам!) Лучше узнать о помеченных утверждениях.


Кстати, return работает в том случае, когда вам нужно вырваться из finally. Но вам следует избегать выполнения return в finally блоке, потому что семантика немного сбивает с толку и может вызвать у читателя головную боль.

7 голосов
/ 30 июня 2011

Есть несколько способов сделать это:

  1. Переместить код в новый метод и return из него

  2. Обернутьtry / catch в цикле do{}while(false);.

2 голосов
/ 12 марта 2013

В этом примере в блоке catch я изменяю значение счетчика, и оно будет прерываться, пока блок:

class TestBreak {
    public static void main(String[] a) {
        int counter = 0;

        while(counter<5) {
            try {
                counter++;
                int x = counter/0;
            }
            catch(Exception e) {
                counter = 1000;    
            }
        }
    }
}k
1 голос
/ 28 августа 2013

Это код, который я обычно делаю:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }
1 голос
/ 30 июня 2011

как насчет return будет, если нет finally

...