在程序中也是一樣,程序猿是一幫辦事嚴謹、追求完美的高科技人才。在日常開發中,絞盡腦汁將代碼寫的盡善盡美,在程序運行過程中,難免會出現一些奇奇怪怪的問題。有時通過代碼很難去控制,比如:數據格式不對、網絡不通暢、內存報警等。一位好的程序猿也要學習如何處理異常,完善我們的代碼和程序。
java.lang.RuntimeException: 運行時異常
ClassCastException: 類類型轉換異常,當試圖將對象強制轉換為不是實例的子類時,拋出該異常;
ArrayIndexOutOfBoundsException: 數組下標越界異常,當你使用不合法的索引訪問數組時會拋出該異常;
NullPointerException: 空指針異常,通過null進行方法和屬性調用會拋出該異常;
ArithmeticException: 算術運算異常,除數為0,拋出該異常;
NumberFormatException: 數字轉換異常,當試圖將一個String轉換為指定的數字類型,而該字符串確不滿足數字類型要求的格式時,拋出該異常;
InputMismatchException: 輸入不匹配異常,輸入的值數據類型與設置的值數據類型不能匹配。

從上圖中可以看到:
通俗點兒講:就是我們在編寫代碼時的異常(比如代碼下面出現紅色的波浪線)
廣泛的說,什么時候會有IOException ,比如你文件都不到的時候 ,你在做數據庫操作的時候數據庫底層出現問題 ,或者你系統IO出問題了 ,系統拿不到文件句柄 ,你說的讀著讀著突然被刪了,你可以試試,書不定真可以 ,你可以看有多少IOExeption個子類,差不多就有多少種類型。
注意,這里的找不到是在你的編譯結果文件夾里面找不到,而不是在你的工程里面找不到,很多同學說自己工程里面有這個文件,為什么還要報這個異常?這個時候,你最好跑到你的編譯文件放的文件夾下面,比如tomcat的webapps文件夾下面,找找你的工程對應的文件夾,看看那個里面有沒有你的文件
屬于編譯時異常,是在classloader加載類的時候發現類不存在在類路徑的時候報出的。
通俗點兒講:就是我們在執行代碼時的異常(運行框會報出以下名字的異常)
ArrayIndexOutofBoundsException 數組越界異常
ClassCastException 類型轉換異常
NullPointerException 空指針異常
IllegalAccessException 非法的參數異常
InputMismatchException 輸入不匹配異常
通俗點兒講:在操作之前就做充分的檢查,例如:
boolean ret = false;
ret = 登陸游戲();
if (!ret) {
處理登陸游戲錯誤;
return;
}
ret = 開始匹配();
if (!ret) {
處理匹配錯誤;
return;
}
ret = 游戲確認();
if (!ret) {
處理游戲確認錯誤;
return;
}
優點:可以時時了解代碼中的異常方便且快速找到異常位置并處理。
缺陷:正常流程和錯誤處理流程代碼混在一起 , 代碼整體顯的比較混亂,過程繁瑣。
(不加return的話,一旦出現一個異常,后面異常會一起拋出,分辨不清)
通俗點兒講:就是先操作, 遇到問題再處理,例如:
try {
登陸游戲();
開始匹配();
游戲確認();
選擇英雄();
載入游戲畫面();
...
} catch (登陸游戲異常) {
處理登陸游戲異常;
} catch (開始匹配異常) {
處理開始匹配異常;
} catch (游戲確認異常) {
處理游戲確認異常;
} catch (選擇英雄異常) {
處理選擇英雄異常;
} catch (載入游戲畫面異常) {
處理載入游戲畫面異常;
}
上述代碼意思是:try{}中編寫的是可能出現的異常的代碼,catch()中寫異常的名字例如(NullPointerException、ArithmeticException等),catch(){}中寫異常的處理。(不明白的話可以往下面看,有詳細介紹try()和catch() )
優勢:正常流程和錯誤流程是分離開的 , 程序員更關注正常流程,代碼更清晰,容易理解代碼
異常處理的核心思想 。
缺點:部分異常執行后需要及時處理,這個方式需要等待try{}中所有代碼執行完成
特別注意:如果catch()中異常之間有父子關系,那么一定是子類異常在前catch,父類異常在后catch,否則報錯。
有些情況下我們想自定義一個異常,或者我們忘記了java中的異常名字也需要自定義異常,或者在 Java 中,可以借助 throw 關鍵字,拋出一個指定的異常對象,將錯誤信息告知給調用者。具體語法如下:(使用很頻繁)
throw new XXXException("異常產生的原因");
實例:實現一個獲取數組中任意位置元素的方法。
public static int getElement(int[] array, int index){
if(null == array){
throw new NullPointerException("傳遞的數組為null");
}
if(index < 0 || index >= array.length){
throw new ArrayIndexOutOfBoundsException("傳遞的數組下標越界");
}
return array[index];
}
public static void main(String[] args) {
int[] array = {1,2,3};
getElement(array, 3);
}
結果:
傳遞的數組下標越界
【 注意事項 】