Exception和Error

piny發表於2021-09-09

Throwable

ThrowableExceptionerror的父類。而Exceptionerror的作用不同,這裡的兩個不同的子類體現的是異常中分類的思想。

圖片描述

如上圖所示,ExceptionError的分類依據是對於會出現問題帶程式碼我們是否應該捕獲。

應該捕獲(Exception)

對於Exception我們是應該捕獲的,不過Exception中也可以進行分類,分類的一句是是否能檢查,也就是該異常是在編譯器就知道還是在執行時才能知道。

checked

對於在編譯期就可以知道的異常就是可檢查的異常,比如ClassNotFoundException

unchecked

對於在編譯期不知道,在執行時可能會出現的異常就是執行時異常,比如

  • NullPointerException
  • ArrayIndexOutOfBoundException
  • ClassCastException

不能捕獲(Error)

對於有些錯誤出現了我們是不能處理的,很多都是jvm虛擬機器自身出了問題,對於這樣的問題即使我們能捕獲也是處理不了的,所以這些不可捕獲的類別就透過Error來定義。比如說下面的幾個錯誤

  • OutOfMemoryError
  • StackOverFlowError
  • NoClassDefFoundError

throw和throws

package example;

public class TestThrow {
    public static void main(String[] args) {
        one();
    }
    public static void one() throws ArithmeticException{
        try {
            int i = 1 / 0;
        } catch (ArithmeticException e) {
            throw new ArithmeticException("by / zero");
        }
    }
}

Throw

  • 作用在方法內,表示丟擲具體異常,由方法體內的語句處理。
  • 具體向外丟擲的動作,所以它丟擲的是一個異常實體類。若執行了Throw一定是丟擲了某種異常。

Throws

  • 作用在方法的宣告上,表示如果丟擲異常,則由該方法的呼叫者來進行異常處理。
  • 主要的宣告這個方法會丟擲會丟擲某種型別的異常,讓它的使用者知道捕獲異常的型別。出現異常是一種可能性,但不一定會發生異常。

ClassNotFoundException和NoClassDefFoundError

  • 對於ClassNotFoundException是一個檢查異常,比如下面的程式碼
package example.classobject;
import org.junit.Test;
public class ClassObject {
    @Test
    public void testException () throws ClassNotFoundException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
    }
}

上面的程式碼去載入mysql資料庫驅動,如果沒有載入到就會出現類沒有找到的異常

  • NoClassDefFoundErrorError,這裡說明是可以程式碼可以透過編譯,但是實際執行的是在發現找不到編譯後的class就會出現這個錯誤.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2824955/,如需轉載,請註明出處,否則將追究法律責任。

相關文章