Throwable |
Exception |
Error |
RuntimeException |
ClassNotFoundException |
IOException |
SQLException |
IndexOutOfBoundsException |
ClassCastException |
NullPointerException |
OutOfMemoryError |
StackOverflowError |
NoClassDefFoundError |
Java采用違例(Exception)處理機製來進行錯誤處理。 違例機製的一個好處就是能夠簡化錯誤控製代碼, 我們再也不用檢查一個特定的錯誤, 然後在程序的多處地方對其進行控製。 此外, 也不需要在方法調用的時候檢查錯誤(因為保證有人能夠捕獲這裡的錯誤)。 我們隻需要在一個地方處理問題:”違例控製模塊”或者”違例控製器”。 這樣可有效減少代碼量, 並將那些用於描述具體操作的代碼與專門糾正錯誤的代碼分隔開。
一個完整的違例例子:
public void throwTest() throws MyException {
try {
...
} catch (SQLException se) {
cat.error("", se);
throw new MyException(se.getMessage());
} catch (Exception e) {cat.error("", e);
} finally {
...
}
}
如果一段代碼有可能會拋出違例可以用try {} catch {}來處理。 被catch到的違例可以再拋出, 也可以轉換為其它類型的Exception拋出。 finally塊裡麵的代碼總會被執行到的, 不管前麵是否已經throw或return了。
Throwable是所有違例的基類, 它有兩種常規類型。 其中, Error代表編繹期和係統錯誤, 我們一般不必特意捕獲它們。 Exception是可以從任何標準Java庫的類方法中擲出的基本類型。
看上麵的圖, 如果是Error的子類或是RuntimeException的子類這種違例有一定的特殊性, 可以說我們可以當它們不存在, 當這種違例拋出的時候, 我們可以不catch它, 也可以不在方法上throws它。 RuntimeException一般代表的是一個編程錯誤, 是完全可以避免的。
性能注意點: 因為使用了Exception之後是要影響一些效率的, 所以Exception不能濫用。一般的不要用Exception來控製業務流程, 其次不要循環體內使用。
技巧:我們可以從Exception或直接從Throwable繼承寫我們自己的Exception, 然後根據業務需要拋不同種類的Exception。