Try,Catch和Finally块

时间:2011-09-11 11:58:14

标签: java try-catch

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"也会被打印出来。抛出异常,因此它假设找到匹配的catch并执行finally块,但它继续myMethod方法并打印myMethod is done,它不是finally块的一部分。为什么呢?

6 个答案:

答案 0 :(得分:9)

这就是try-catch-finally的工作方式。因为您捕获了异常,所以它被认为已被处理,并且正常继续执行。

如果你没有抓住它,或者重新抛出它,那么“myMethod就完成了”将不会被打印出来,并且异常会在堆栈中冒出来,直到它被其他地方捕获。

请注意,finally始终执行,例外或不执行。

答案 1 :(得分:5)

另一方面,如果您有以下内容:

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 :(得分:2)

您处理了异常,因此方法处理仍在继续。

答案 3 :(得分:1)

您已捕获异常,这意味着它不会再传播。在try语句之后立即执行,该语句是打印myMethod is done的语句。

答案 4 :(得分:1)

从技术上讲,您已经处理了异常,因此继续执行。

答案 5 :(得分:1)

据推测它说“抛出异常”,然后“完成异常”,然后“myMethod完成”。这就是应该做的。

因为您自己捕获异常,所以只有在整个try-catch-finally块完成后才会继续执行。这是一个捕获声明的重点。