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块的一部分。为什么呢?
答案 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块完成后才会继续执行。这是一个捕获声明的重点。