在我們的實際開發中,總會遇到各式各樣的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]);
}
ClassNotFoundException 指定的類找不到異常
public static void main(String[] args) {
try {
// 加載驅動類,該類不存在
Class.forName("hello.hi");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
NumberFormatException 字元串轉換為數字異常
public static void main(String[] args) {
// 将字元串轉為int類型失敗
Integer c = new Integer("abc");
System.out.println(c);
}
NullPointerException 空指針異常
public static void main(String[] args) {
// 對象引用為 null
String str = null ;
// 比較時 會出現空指針異常
if(str.equals("test")){
System.out.println(str);
}
}
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。。。");
}
總結
在我們實際開發過程當中,遇到的BUG肯定不止上述這些,關鍵問題是作為程式開發人員,我們不光要知道這些BUG的産生原因,也需要明白如何調試。畢竟實際生産還是以程式正常運作,無BUG為主。