Блоки Try, Catch и Наконец - PullRequest
       0

Блоки Try, Catch и Наконец

3 голосов
/ 11 сентября 2011
public class D {

void myMethod() {
    try {
        throw new IllegalArgumentException();
    } catch (NullPointerException npex) {
        System.out.println("NullPointerException thrown ");
    } catch (Exception ex) {
        System.out.println("Exception thrown ");
    } finally {
        System.out.println("Done with exceptions ");
    }
    System.out.println("myMethod is done");
}

public static void main(String args[]) {
    D d = new D();
    d.myMethod();
}

}

Я не понимаю, почему "myMethod is done" также печатается.Было сгенерировано исключение, поэтому предполагается, что он нашел соответствующий улов и выполнил блок finally, но продолжает метод myMethod и печатает myMethod is done, который не является частью блока finally.Почему?

Ответы [ 6 ]

9 голосов
/ 11 сентября 2011

Вот как работает try-catch-finally.Поскольку вы поймали исключение, оно считается обработанным, и выполнение продолжается как обычно.

Если вы его не поймали или повторно выбросили, то «myMethod is done» не будет иметьбыло напечатано, и исключение могло бы пузыриться в стеке, пока оно не было перехвачено где-то еще.

Обратите внимание, что блок finally всегда выполняется, исключения или нет.

5 голосов
/ 11 сентября 2011

С другой стороны, если у вас есть следующее:

void myMethod() {
    try {
        throw new IllegalArgumentException();

        System.out.println("Line after exception");   /// new line added here

    } catch (NullPointerException npex) {
        System.out.println("NullPointerException thrown ");
    } catch (Exception ex) {
        System.out.println("Exception thrown ");
    } finally {
        System.out.println("Done with exceptions ");
    }
    System.out.println("myMethod is done");
}

public static void main(String args[]) {
    D d = new D();
    d.myMethod();
}

Тогда «Строка после исключения» будет НЕ печатать.

2 голосов
/ 11 сентября 2011

Вы обработали исключение, поэтому обработка метода продолжается.

1 голос
/ 11 сентября 2011

Предположительно, в нем написано «Исключение выброшено», затем «Завершено с исключениями», а затем «Мой метод завершен». Вот что он должен делать.

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

1 голос
/ 11 сентября 2011

Технически говоря, вы уже имели дело с исключением (ями), и поэтому выполнение продолжается.

1 голос
/ 11 сентября 2011

Вы поймали исключение, что означает, что оно не будет распространяться дальше.Выполнение продолжается сразу после оператора try, который является оператором, который печатает myMethod is done.

...