天天看點

京東一面:你在開發中遇到過哪些RuntimeException異常?

作者:尚矽谷教育

在我們的實際開發中,總會遇到各式各樣的Bug。比如我們知道的異常類型有編譯時異常、運作時異常等等,那麼今天我們就重點來說下運作時異常。

一、異常結構分析

首先我們對Java語言中的異常類進行一下說明。在Java語言中所有異常類型都是内置類java.lang.Throwable類的子類,即Throwable是所有異常和錯誤的根類。

在Throwable根類下,提供了2個分支Exception 和 Error。其中Exception下又分為了運作時異常和非運作時異常。那麼我們接下來重點看下運作時異常。

二、常見運作時異常

NullPointerException

java.lang.NullPointerException 空指針異常。

出現原因:調用了未經初始的對象或者是不存在的對象。

ClassNotFoundException

java.lang.ClassNotFoundException 指定的類找不到。

出現原因:類的名稱和路徑加載錯誤;通常都是程式 試圖通過字元串來加載某個類時可能引發異常。

NumberFormatException

java.lang.NumberFormatException 字元串轉換為數字異常,該異常是IllegalArgumentException異常的子類異常。

出現原因:字元型資料中包含非數字型字元。

IndexOutOfBoundsException

java.lang.IndexOutOfBoundsException 數組角标越界異常,常見于操作數組對象時發生。

出現原因:操作數組或者集合時,超出其長度。

IllegalArgumentException

java.lang.IllegalArgumentException 方法傳遞參數錯誤異常。

出現原因:方法傳遞參數個數、參數類型、參數順序不符合方法參數要求。

ClassCastException

java.lang.ClassCastException 資料類型轉換異常。

出現原因:資料類型轉換異常。

NoClassDefFoundException

java.lang.NoClassDefFoundException 未找到類定義錯誤。

出現原因:當方法調用某個類或者某個類中方法時,該類不存在。

NoSuchMethodException

java.lang.NoSuchMethodException 方法不存在異常。

出現原因:當調用某個方法時,該方法在類中不存在,導緻調用不到。

三、異常代碼分析

IndexOutOfBoundsException 數組角标越界異常

public static void main(String[] args) {

// 定義 arr 數組 ,長度為5

int[] arr = {2,6,9,8,0};

// 角标從0開始,最大角标為5,arr[5] 超出角标範圍

System.out.println(arr[5]);

}

京東一面:你在開發中遇到過哪些RuntimeException異常?

ClassNotFoundException 指定的類找不到異常

public static void main(String[] args) {

try {

// 加載驅動類,該類不存在

Class.forName("hello.hi");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

京東一面:你在開發中遇到過哪些RuntimeException異常?

NumberFormatException 字元串轉換為數字異常

public static void main(String[] args) {

// 将字元串轉為int類型失敗

Integer c = new Integer("abc");

System.out.println(c);

}

京東一面:你在開發中遇到過哪些RuntimeException異常?

NullPointerException 空指針異常

public static void main(String[] args) {

// 對象引用為 null

String str = null ;

// 比較時 會出現空指針異常

if(str.equals("test")){

System.out.println(str);

}

}

京東一面:你在開發中遇到過哪些RuntimeException異常?

NoSuchMethodException 未找到方法異常

@org.junit.Test

public void test01() {

// 擷取目前類的位元組碼對象

Class<TestKZZ> aClass = TestKZZ.class;

try {

// 通過位元組碼對象擷取方法對象

Method method = aClass.getMethod("show",Object.class);

// 通過方法對象,執行目标方法

method.invoke(this,Object.class);

} catch (Exception e) {

e.printStackTrace();

}

}

// show方法私有

private void show(Object obj){

System.out.println("show。。。");

}

京東一面:你在開發中遇到過哪些RuntimeException異常?

總結

在我們實際開發過程當中,遇到的BUG肯定不止上述這些,關鍵問題是作為程式開發人員,我們不光要知道這些BUG的産生原因,也需要明白如何調試。畢竟實際生産還是以程式正常運作,無BUG為主。

繼續閱讀