異常是程序中的一些錯誤,但並非全部的錯誤都是異常,而且錯誤有時候是能夠避免的。java
好比說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;若是你用System.out.println(11/0),那麼你是由於你用0作了除數,會拋出 java.lang.ArithmeticException 的異常。程序員
Java中的異常主要分爲下列幾類:函數
全部的異常類是從 java.lang.Exception 類繼承的子類。 Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error 。它們之間的關係入下圖:code
從Exception繼承的類都是異常,異常能夠被處理,處理完後程序仍然能夠繼續運行。從Error繼承來的類都是錯誤,在運行時錯誤沒法被處理,只能修改代碼邏輯。從Runtime中繼承的類都是運行時異常,這類異常在程序中能夠處理,也能夠不處理。而非運行時異常在代碼中必須處理。否則編譯會報錯。對象
Java中的異常處理主要有下列幾種:blog
throw
在指定方法中拋出指定異常。好比 throw IOException();
在方法中拋出了一個IO異常throws
將異常拋出給調用者處理。在函數聲明時使用。方法聲明時能夠拋出多個異常,若是多個異常有繼承關係,那麼只須要拋出父類異常便可。若是父類的方法沒有拋出異常,子類在重寫父類方法時也不能使用這種方式拋出異常try...catch
處理異常。在使用try 處理異常時須要注意:繼承
Throwable
中定義了3個異常處理的方法:資源
String getMessage()
: 返回異常的詳細信息String toString()
: 返回異常的簡短信息void printStackTrace()
: 打印異常的調用信息這些異常信息通常在try...catch 中使用,例如get
try { //do something }catch(Exception e){ e.printStackTrace(); }
不管異常是否發生,finally中的代碼都會執行。通常finally中編寫釋放資源的代碼,好比釋放文件對象。須要注意的是,finally中會改變return的執行順序,無論return在哪,都會最後執行finally中的returnit
try{ //do some thing return; }catch(Exception e) { return; } finally{ return; //會執行這個 } return;
自定義異常時須要注意:
Throwable
類,若是要定義檢查性異常,須要繼承 Exception
,要定義運行時異常,須要繼承 RuntimeException
。class MyException extends Exception{ }
假設咱們定義一個異常類,表示取錢的異常,當取錢數少於1000時報異常,提示用戶去ATM取,能夠這樣寫
class TooLittleMoneyException extends Exception { private int money; private String message; TooLittleMoneyException(int money){ message = "" + money + "太少,請到ATM自助取款機去取"; } String getMessage(){ return message; } } //取錢方法 //打開交易通道 //校驗帳戶是否合法 try{ if (money < 1000){ throw TooLittleMoneyException(money); } //取錢,並在對應帳戶中減小相應的金額 }catch(TooLittleMoneyException e){ System.out.println(e.getMessage()); }finally{ //關閉交易通道 }