1. 程式人生 > >Java異常( Throwable)的處理以及常見的異常類列表

Java異常( Throwable)的處理以及常見的異常類列表

        異常指Java程式執行中遇到的非致命性錯誤,而不是編譯時期的語法錯誤,比如0溢位、陣列越界、檔案找不到等。

        Java面向物件的方式來處理異常,異常也被看成物件,和一般物件也沒有什麼區別,但異常必須是Throwable的類及其子類所產生的物件的例項。它也像其他物件一樣封裝了資料和方法。

        Throwable物件在定義中包含一個字串資訊,而這個屬性可以被所有的異常類繼承,Java程式中,異常處理的機制為:丟擲異常、捕捉異常。

當程式出現一些問題的,可以是嚴重問題,可以是一種異常,將這些通常為Throwable

 Throwable 類是 Java 語言中所有錯誤或異常的超類
 Throwable
 error
 exception
 
  舉例:
  張三去山上旅行

  1)張三騎車去旅行,山路崩塌了,不能前行了----->不可抗力因素error:屬於嚴重問題   記憶體溢位了 (載入頁面中大量圖片的時候,程式會掛掉---使用第三方的框架去處理:ImageLoader)

  2)張三騎車去旅行,騎著發現輪胎沒氣了------->需要檢查的問題。屬於編譯時期異常:只要出現的不是執行時期異常,統稱為編譯時期  日期的文字格式---解析    java.util.Date型別:ParseException:解析異常

  編譯時期異常:開發者必須處理!

  3)騎著,山路有石子,他就非得往石子上騎,導致車胎沒氣了---->自己原因造成的,no zuo no die屬於執行時期異常:RuntimeException編譯通過了,但是開發者程式碼不嚴謹(NullPointerExceptino等等...)

異常的處理分為兩種:

 (1)try...catch...finally (標準格式) :捕獲異常
 (2)throws ...丟擲異常
 
 變形格式...
                    (1)    try...catch...
                     (2)    try...catch...catch...
                     (3)    catch....
 

變形格式的第一種(1)    try...catch...

                try{

 一些程式碼
 try裡面的程式碼越少越好
 程式碼包含了可能會出現問題的程式碼
               }catch(異常類 異常類物件){
       try出現異常了,描述的異常剛好就是catch的異常類,就會執行catch裡面程式碼
 //處理異常 }

如何處理多個異常兩個或兩個以上的異常的時候怎麼辦?此時採用變形格式    (2)    try...catch...catch...
  try{
  可能出現問題的程式碼
  int[] arr = {1,2,3} ;
 Sop(arr[3]);
  int a = 10 ;
  int b =0 ;
Sop(a/b) ;

  }catch(異常類名1 物件名1){//異常處理
  
  }catch(異常類名2 物件名2(){//異常處理

                  }

try...catch...finally
 finally語句體是一定會執行的,除非是Jvm退出了 
 問題:如果catch裡面有return 語句,finally中的程式碼還會執行,是在return語句之前執行還是return後執行?

答:finally中程式碼是一定會執行的,是在return前

程式示範如下:


public static void main(String[] args) {
System.out.println(getInt());
}


private static int getInt() {
int a ;
try {
a = 10 ;
System.out.println(a/0);
a = 20 ;
}catch(Exception e) {
a= 30 ;
return a ;
/**
* try的程式碼出現問題了,執行catch中的語句,30賦值a,
* return 30(已經形成了一個迴路徑)finally程式碼一定會執行(除非Jvm) a = 40 ,在fianlly外面
* 有return a: a記錄迴路徑的那個a,返回30
*/
}finally {
//除非jvm退出了
a = 40 ;

}
return a;//30

}

異常中的注意事項:
 *子類繼承父類的時候的注意事項 
 *1)子類重寫父類的方法的時候,子類的方法的丟擲的異常必須要麼是父類的方法異常一樣,要麼是父類方法異常的子類
 *2)子類重寫父類方法的時候,如果父類中的這個方法沒有丟擲異常,那麼子類重寫的這個方法也不能丟擲異常,只能try...catch
 */

常見的異常類列表
異常類名稱異常原因
ArithmeticException數學錯誤,被0除
ArraylndexOutOfBoundsException陣列下標越界
ArrayStoreException程式試圖在陣列中儲存錯誤型別的資料
ClassCastException型別強制轉換異常
IndexOutOfBounchsException當某物件的索引超出範圍時丟擲異常
NegativeArraySizeException建立元素個數為負的陣列異常類
NullPointException空指標異常
NumberFormatException字串轉換為數字異常類
SecurityExceptionApplet試圖執行瀏覽器的安全設定不允許的動作
StringIndexOutBounchsException程式試圖訪問字串中字元不存在的字元位置
OutOfMemoryException分配給新物件的記憶體太小
SockedException不能正常完成Socked操作
ProtocolException網路協議有錯誤
ClassNotFoundException未找到相應的異常類
EOFException檔案結束異常
FileNotFoundException檔案未找到異常
illegalAccessException訪問某類被拒絕時丟擲的異常
InstantiationException

試圖通過new Instance()方法建立一個抽象

類或抽象介面的例項時出現的異常

IOException輸入、輸出異常
NoSuchFileException欄位未找到異常
NoSuchMethodException方法未找到異常
SQLException操作資料庫異常
throw:表示也是丟擲異常,丟擲的一個異常物件 (throw new 異常類名() :匿名物件的方式)
throws和throw的區別?
 throws:也是表示丟擲異常,它後面跟的異常類名,並且可以多個異常類名中間逗號開
 舉例:public void show() throws IoException,ClassNotFoundException{...}
在方法上丟擲,由呼叫者處理
 它表示丟擲異常的可能性
 throw:丟擲的一個異常物件
 在語句體中丟擲的,由語句體進行處理
 它表示丟擲異常的肯定性