Нет блока catch, но выполнение продолжается без предупреждения или ошибки

1

У меня такой код. В aMethod() блок try, но нет блока catch для обработки исключенного aMethod(). И полученный результат окончательно завершен. Может ли кто-нибудь объяснить мне, как это происходит?

   public class Test 
    {  
        public static void aMethod() throws Exception 
        {
            try /* Line 5 */
            {
                throw new Exception(); /* Line 7 */
            } 
            finally /* Line 9 */
            {
                System.out.print("finally "); /* Line 11 */
            } 
        } 
        public static void main(String args[]) 
        {
            try 
            {
                aMethod();  
            } 
            catch (Exception e) /* Line 20 */
            {
                System.out.print("exception "); 
            } 
            System.out.print("finished"); /* Line 24 */
        } 
    }
Теги:
exception-handling
try-catch-finally

2 ответа

1
Лучший ответ
  • блок finally всегда выполняется, исключение или нет *. Это то, что вызывает первую распечатку "finally" которую вы видите.
  • Затем неперехваченное исключение распространяется на main, где оно попадает в блок catch, производя "exception".
  • После этого ваша программа печатает "finished" для завершения вывода.

То есть, как, finally, работает. Более того, если вы это сделаете

try {
    throw new Exception();
} catch (Exception e) {
    ...
} finally {
    ...
}

код в обоих блоках catch и finally будет выполнен.

* Есть угловые случаи, когда вы можете построить программу, которая выходит без выполнения блока finally, но это не имеет никакого отношения к коду в вашем примере.

  • 0
    Я не согласен с вашим первым пунктом, наконец, блок всегда выполняется, исключение или нет . Может быть вероятность, что блок finally никогда не будет выполнен (не в этом вопросе).
  • 0
    Ну, я согласен сейчас. Но позвольте мне прояснить еще одну вещь. если в попытке aMethod () возникнет непроверенное исключение, а блок catch все еще отсутствует. Теперь вывод будет одинаковым или чем-то другим?
Показать ещё 1 комментарий
1

Вы объявили aMethod() как aMethod() throws Exception, поэтому он может выкинуть любое проверенное исключение и ничего не поймать.

  • 0
    Хорошо, но позвольте мне уточнить, будет ли исключение без проверки, и все же блок catch отсутствует. Теперь, что будет выход? Ошибка или такая же, как указано выше.
  • 1
    @choxx Для непроверенных исключений вам никогда не придется их отлавливать, вне зависимости от условия throws . Выход будет таким же.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню