標籤:
一、從根部異常可以分為Erro和Exception兩大類他們都繼承自Thorwable:
Error一般指的是一些無法挽回的錯誤,當這些錯誤發生後,程式就會直接死掉,無法繼續運行。
Exception : 一般分為:運行時異常和非運行時異常,
運行時異常:指的是程式已經通過編譯,在程式運行時產生了異常,這個是由於程式自己編寫的代碼不夠健壯,考慮不夠完善導致的。如果程式員足夠認真這些是完全可以避免的。
非運行時異常:是程式碼語法錯誤 ,在程式編譯時間就不能通過而拋出的異常。
public class Test { public static void main(String[] args) { String filename = "d:\\test.txt"; try { FileReader reader = new FileReader(filename); Scanner in = new Scanner(reader); String input = in.next(); int value = Integer.parseInt(input); System.out.println(value); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { System.out.println("this is finally block!"); } } }
如果d盤根目錄下沒有test.txt的話,該程式拋出異常:
this is finally block!
java.io.FileNotFoundException: d:\test.txt (系統找不到指定的檔案。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at java.io.FileReader.<init>(FileReader.java:41)
at Test.main(Test.java:10)
可以看出上面的異常拋出時沒有指名異常的具體發生出處。
我們將test.txt中的2322改成abc,看看結果:
this is finally block!
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at Test.main(Test.java:13)
這時我們會發現,該異常指明了異常的內容和發生的出處,那時因為該異常我們沒有對它進行聲明,而FileNotFoundException我們對它進行了聲明所以,在此異常拋出時沒有指名它的出處。
總結: 異常的一般處理,如果我們聲明一個異常秉承並處理它,則在該異常發生時會進行相應的處理。如果對於一個異常我們沒有對它進行聲明處理,那麼在異常發生時,回去調用相關的方法,如果該方法也沒有聲明處理,則它會一直回溯直至main函數。
二、常見的異常:
NullPointerException null 指標、ClassNotFoundException 找不到類 、ClassCastException 類型轉換、ArithmeticException 算數條件
ArrayIndexOutOfBoundsException 數組越界
三、自訂異常:
使用自訂異常的原因:一、java不可能封裝所有我們在程式可能用到的異常。二、java封裝的異常提示資訊部明了。基於這兩點我們可以進行自訂異常的建立,來改善異常的處理。
pbulic class MyException extends RuntimeException{ public MyException(){ } pubic MyException(String message){ super(message); } }
四、try/catch/finally的使用方式:
在進行異常處理時,盡量不要將catch 和 finally放在一起使用。
public class FinallyTest{ public static main(String[] agrs){ boolean file = open(); } public static boolean open(){ string filename = "d://test.txt"; try{ try{ FileReader file = new FileReader(filename); Scanner sn = new Scanner(file); String str = sn.next(); int num = Integer.paseInt(str); System.out.println(num); }finally{ //關閉一些資源 } }catch(exception e){ Systme.out.println("檔案內容輸出異常"); } }}
盡量將catch和finally分開處理,catch進行異常的捕捉,finally進行一些流的關閉。。。
java異常學習