Java異常體系

在使用JdbcTemplate中queryForObject方法的時候拋出一個異常:java

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

  queryForObject的內部邏輯是這樣的:使用queryForObject時,會查詢一個結果,當查詢中結果多餘一個或者沒有都會拋出一個異常IncorrectResultSizeDataAccessException。這個向外拋出的異常爲何不須要我使用try-catch處理或者繼續向外拋出呢?下面的圖片展現這個異常的繼承結構。
圖片描述spring

Google以後認識到全部運行時異常均可以不向外拋出。爲了更加快速的解決問題,決定對Java異常進行更深刻的學習。學習

Java異常體系

圖片描述
  首先,Throwable標誌這是一個異常。
  其次,Throwable有兩個子類分別是Error和Exception,Error表示的是JVM發生的異常,如內存溢出,這是應用自身程序自己沒法處理的異常;而Exception則表示應用程序自身能夠處理的異常。
  最後,Exception的子類分爲兩類,一個是RuntimeException,另外就是其餘繼承自Exception的異常,如IOException。區分這兩類異常主要特性是是否受檢。spa

什麼是受檢異常,什麼是非受檢異常?
  本質上,受檢異常指的是會受到Java 編譯器檢測的異常,也就是說當你的一個方法中有拋出一個受檢異常時,
你必須對它進行處理,使用try-catch或者向上拋出進行處理。非受檢異常指的是不會受到Java編譯器檢測的異常,
當你的一個方法中拋出了非受檢異常時,你不須要進行處理。
 
 Java意圖上使用非受檢異常來表示因爲軟件開發人員致使的錯誤,如NullPointerException;而使用
受檢異常來表示一些用戶誤操做的錯誤,如IOException。「The Java Tutorial」告訴咱們一般狀況下咱們
應該拋出受檢異常,而不要拋出非受檢異常。

  想想,若是是來自外部的數據有錯誤,咱們能夠拋出異常來講明用戶傳入的參數有錯誤;而若是是開發人員致使的
錯誤,且咱們開發人員本身都知道本身的代碼有異常,那直接改正不久好了,幹嗎還要向外拋出呢!因此一般是不會
繼承非受檢異常的。

  運行時異常雖然能夠不進行處理,可是可能致使線程終止或者應用終止。若是是非主線程,則由Thread.run()拋出異常後,線程終止。若是是主線程(即main方法)拋出異常,則應用終止。線程

有興趣能夠將下面的代碼複製到編譯器中來檢測受檢異常和非受檢異常。code

public class Main {
    public void caller() {
        callee();
    }

    public void callee() throws Exception{
        throw new Exception();
    }
}

上面的代碼中在調用callee方法的時候將編譯不過。繼承

public class Main {
    public void caller() {
        callee();
    }

    public void callee(){
        throw new RuntimeException();
    }
}

上面的代碼將不會有任何告警。圖片

參考:
Java 的 Checked 和 Unchecked Exception【譯】內存

相關文章
相關標籤/搜索