1. 程式人生 > >Java基礎第十五天--Exception異常

Java基礎第十五天--Exception異常

2. JVM是如何處理異常的?
 如果程式有異常,JVM預設的處理方式是把異常的名稱,原因及異常的位置等資訊
 顯示在控制檯上
 注意:如果JVM採用預設的處理方案,遇到異常,會退出JVM,它不會繼續向下執行
 所以,我們要學習自己的處理方式
 處理異常,不是讓你把異常隱藏,而是編寫處理方案
 
3. 自己處理異常
 1)自己編寫程式碼處理
  格式:
   try{
    可能會出問題的程式碼;
   }catch(異常物件){  //異常物件--異常類名 變數名
    對問題的處理;
   }finally{
    釋放資源;
   }
 2)把異常丟擲Throw
 
4. 異常物件要掌握的方法
 1)toString()
 public String toString() -- 返回此throwable的簡短描述
 類的全路徑名稱:本地訊息描述
 2)public String getMessage()-- 返回此throwable的詳細訊息字串
 3)public void printStackTrace() -- 列印異常的資訊
 
 注意:標準解決方案
 try{}
 catch(異常物件){
  物件.printStackTrace();
 }
 它和jvm預設處理方案顯示的資訊是一致的,但是,自己處理後,
 程式碼還可以繼續向下執行
 
5. 多個異常的處理方法
 很多時候,我們可能無法去判斷哪裡出問題了?怎麼辦?
 把所有程式碼全部放到try裡面?--不推薦
 推薦--儘可能把少的程式碼放到try裡面
 1)針對每一個問題,給出對應的處理方案
 2)把多個處理放到一個地方,也就是一個try對應多個catch
    注意:如果多個子異常,你不知道怎麼接收,就用父類Exception接收,不過不推薦
    推薦--知道是哪個異常類,就用那個來接收
    處理過程中的問題:
    a)一旦在try裡面的某個地方發生了問題,就會從這裡結束。直接到catch裡面去
    b)在使用多個catch的時候,如果有子父關係,父一定要放在最後一個catch裡面
       如果沒有子父關係,這多個catch可以任意放置
   
    在JDK7以後,出現了一個新的處理方案,針對多個異常是平級的關係:
    catch(ExceptionA|ExceptionB|ExceptionC ... e){}
   
6. finally:用於釋放資源。finally裡面的程式碼肯定會被執行
 注意:如果在執行到finally之前,JVM退出了,finally肯定不會執行
 面試題1:final, finally, finalize的特點及區別
  1)final是一個修飾符,可以修飾類,修飾方法,修飾變數
    它修飾的類不能被繼承,修飾的方法不能被重寫,修飾的變數是常量
  2)finally是異常處理的一部分
  3)finalize()是Object類的方法,用於垃圾回收
 面試題2:在catch裡面有一個return語句,請問finally裡面的內容還會被執行嗎?
 如果會,請問是在return前,還是後?
  會被執行;catch裡面的return會形成一條返回路徑,但是,它發現還有finally,
  所以會去執行finally,之後繼續執行catch中的return返回路徑
  -- finally僅僅是為了釋放資源,而不改變結果
  
7. 對異常丟擲--Throws
 在宣告方法的時候,就相當於告訴別人,我的方法有異常,我沒有處理,丟擲來了
 格式:方法小括號後面寫:throws 異常類名
 注意:這個時候,呼叫該方法者應該來處理這個問題 try-catch方法
 面試題3:throws和throw的區別?
 throws:在方法宣告上,後面跟的是異常類名  
  throws聲明後面如果跟的是一個編譯期異常,呼叫者是必須處理的
 throw:在方法體中,後面跟的是異常物件名
  throw後面如果丟擲的是編譯時期異常物件,那麼,一般在方法宣告上使用throws的
8. 所有的RuntimeException的異常不需要處理,因為它需要你修正程式碼的引數或者邏輯
 我們講解的兩種異常處理方案是針對非RuntimeException的Exception
 處理原則是:
 1)能自己處理的就自己處理
 2)在main方法中儘量不要丟擲異常
 3)將來在實際開發中,我們會把不同的異常給出不同的介面進行顯示
 
9. 自定義異常
 自己定義的類應該去繼承java提供的異常類RuntimeException(執行期異常)或者Exception(異常父類,可用來代表編譯器異常)
 
10. 子父關係中的異常處理 子類重寫方法中不能丟擲比父類還要大的異常