java異常處理機制,一般形式為Try{} catch {} finally{},其中只有當Try代碼塊中出現了異常,才會跳轉到catch代碼塊,而finally是無論如何都會執行的。
第一種情況:
Try
{
}
catch(IOExcetion e)
{
}
finally
{
}
1.如果try代碼塊不出現異常,那么catch中的語句不會執行,當執行完finally代碼塊后,程序正常結束。
2.出現try代碼塊異常,如果異常恰好是IOException或者是IOException的子類,那么會執行catch代碼塊,然后執行finally代碼塊,程序正常結束;
如果為其他異常而且不是IOException的子類,那么同樣不會執行catch代碼塊,當執行完finally代碼塊,程序異常結束,並向外面拋出 未被捕捉到的異常。
第二種情況
程序運行時,日志打印中出現異常提示,是很正常的事情。例如在進行數據庫查詢時,如果發生異常,而你又希望程序繼續執行,你要做的只要捕獲這個異常即可。同時通常大家會將這個異常打印出來,雖然此時由於異常已經被處理,程序實際上在正常運行。
第三種情況
程序出錯,但是並沒有拋出相應異常。這種情況一般出現在出現運行時異常,例如空指針異常,雖然有異常捕捉語句,但是大多數都是針對不得不進行的非運行時異常捕獲,所以很容易丟失異常出現的位置。比如在一個方法中出現了這種異常,在調用它的方法中才有可能報異常,這就導致了異常定位的困難。
so
程序出錯,一般會報異常,所以第一件要做的事情就是定位異常出現的位置。
1. 默認在調試時,會在后台打印出異常信息,以及出現異常的位置。大多數情況下可以幫助你定位到異常位置。
2.如果定位到異常位置,發現該異常已經被捕獲並處理,那么這就不是導致程序出錯的異常位置。需要根據其他信息逐步定位到異常位置。
3.程序出錯,但是沒有相關的異常信息提示,這時需要分析catch語句,逐步調試到異常代碼段。
例如,方法1和方法2都會拋出異常,但是確不會有異常信息提示。
public class Test { public static void main(String[] args) { try { method1(); method2(); } catch (Exception e) { System.err.println("Exception!"); } } private static void method1() { String str = null; System.out.println(str.length()); } private static void method2() { int i= 1/0; } }