[英]Try, Catch and Finally blocks
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塊的一部分。 為什么?
這就是try-catch-finally的工作方式。 因為您捕獲了異常,所以它被認為已被處理,並且執行繼續正常進行。
如果你沒有抓住它,或者重新拋出它,那么“myMethod就完成了”就不會被打印出來,並且異常會在堆棧中冒出來,直到它被別人抓到。
請注意, finally
塊始終執行,異常或否。
另一方面,如果您有以下內容:
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();
}
然后不會打印“異常后排” 。
您處理了異常,因此方法處理繼續。
你已經發現了異常,這意味着它不會再傳播。 在try語句之后立即執行,該語句是打印myMethod is done
的語句。
從技術上講,您已經處理了異常,因此繼續執行。
據推測它說“拋出異常”,然后“完成異常”,然后“myMethod完成”。 這應該是它應該做的。
因為您自己捕獲異常,所以只有在整個try-catch-finally塊完成后才會繼續執行。 這是一個捕獲聲明的重點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.