異常處理理解

異常:
異常的分類
  Java會將所有的異常封裝成對象,其根本父類爲Throwable。
  Throwable有兩個子類:Error 和Exception。
  
  Error:一個Error對象表示一個程序錯誤,指的是底層的低級的不可恢復的嚴重錯誤
   遇到Error,程序一定會退出,因爲已經失去了運行所必須的物理環境。
   對於Error我們無法進行處理,因爲我們是通過程序來應對錯誤的,可是程序已經退出了。
   
  Exception:由特定因素,導致程序無法繼續,但不影響虛擬機的正常執行。
   未檢查異常(Runtime Exception):
    是因爲程序員沒有進行必要的檢查,由於程序員的疏忽而引起的異常。
    對於未檢查異常可以不處理,編譯可以通過,應對未檢查異常的方法就是養成良好的檢查習慣
   已檢查異常(非Runtime Exception):
    是不可避免的,對於已檢查異常必須處理,否則編譯不通過。
異常處理的機制:
  當一個方法中有一條語句出現了異常,它就會throw(拋出)一個異常對象(throw 異常對象),然後後面的語句不會執行,而返回上一級方法,其上一級方法接受到了異常對象之後,有可能對這個異常進行處理(進行處理則不會上拋),也可能將這個異常傳到它的上一級,如果最上一級(main方法)不處理就會傳給虛擬機,虛擬機就會終止程序的運行。
異常的處理方式:throws和try-catch方法
  try-catch處理方式:
    try{  //一個
   
     (1)可能出現異常的語句

} catch(XxxException e /*捕獲的異常*/){ //0或n個
   
     (2)處理異常的代碼
     
    } finally{  //0或1個
   
     (3)必須要執行的代碼
     
    }
    (4)方法中的其他代碼
     
   如果代碼正確,那麼程序不經過catch語句直接向下運行;
   如果代碼不正確,則將返回的異常對象和e進行匹配,如果匹配成功,則處理其後面的異常處理代碼。
   try中如果發現錯誤,即跳出try塊去匹配catch,那麼try後面的語句就不會被執行。
   一個try可以跟多個catch語句,用於處理不同情況,但是不能將父類型的exception的位置寫在子類型的excepiton之前。
   在try-catch後還可以再跟一子句finally。其中的代碼語句論有沒有異常都會被執行(因爲finally子句的這個特性,所以一般將釋放資源,關閉連接的語句寫在裏面)。
   finally中的代碼和try-catch中的代碼衝突時,finally中的代碼一定會被執行且會忽略try-catch中的代碼。但是如果try-catch中有System.exit(0);(虛擬機退出語句),則不會去執行fianlly中的代碼。
  
  throws/throw處理方式:
   throw 寫在方法內,後面跟一個異常對象。
   throws 在方法的定義中說明方法可能拋出的異常,後面跟異常類的名字,聲明這個方法將不處理異常,把異常交給上一級方法處理。
   調用時,調用者不能拋出範圍更小的異常。
   對於方法a,如果它定義了throws Exception。那麼當它調用的方法b返回異常對象時,方法a並不處理,而將這個異常對象向上一級返回,如果所有的方法均不進行處理,返回到主方法,如主方法也不進行處理,則到虛擬機中,程序中止。
   如果在方法的程序中有一行throw new Exception(),那麼其後的程序不執行,如果沒有對這個可能出現的檢查結果進行處理,那麼程序就會報錯。
   throws和throw沒有必然的聯繫。

  注意:
   方法的覆蓋中,如果子類的方法拋出的異常是父類方法拋出的異常的父類型,那麼編譯就會出錯:在此處子類無法覆蓋父類。
   子類拋出的異常或者與父類拋出的異常一致,或者是父類拋出異常的子類型,那麼子類型不拋出異常。
   如果父類型無throws時,子類型也不允許出現throws。此時只能使用try catch。
  自定義異常:
   a. 使其繼承Exception或者RuntimeException。
   b. 寫構造器,直接調用父類的構造器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章