Как я могу вырваться из блока try/catch без создания исключения в Java

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

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

Итак, любое прямое решение, о котором я не знаю?

7 ответов


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

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

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

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}

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

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

        }
    } while (false);
}

различными способами:

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

...

  • System.exit() ... хотя, возможно, ты не это имеешь в виду.

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

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


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


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

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

  2. оберните try / catch в do{}while(false); петли.


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

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }

в этом примере в блоке 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

как о return Он будет делать, если нет finally