Exception


異常(Exception)

下圖方格內容為java.lang.Object中的類,箭頭為繼承關系

異常類型

RunTimeException

運行時異常:
此類異常為unchecked(非受查)
即編譯不會檢測出異常,運行時才會出現的異常

常見的類型有:

  • NullPointerException
  • ArithmeticException
  • ClassCastException
  • IndexOutOfBoundsException
  • IllegalArgumentException

OtherException(編譯時異常)

編譯時異常:
此類異常為checked(受查)
即編譯時會檢測出異常

常見的類型有:

  • FileNotFoundException
  • ClassNotFoundException
  • SQLException
  • NoSuchFieldException
  • NoSuchMethodException
  • ParseException

錯誤與異常區別

  • 異常可以是受查或非受查的,錯誤總是非受查的;
  • 異常是由代碼導致的,錯誤是由系統或者低層資源導致的;
  • 異常在應用級被處理,能夠識別的錯誤會在系統級被捕捉;

異常處理

捕獲異常:try&catch&finally

try{...} 
// one or more catch statements
catch (<$EX_CLASS> <$VAR_NAME> [|<$EX_CLASS> <$VAR_NAME> [...]]){...}
finally{...}
  • try:運行代碼,若遇到異常則try內代碼停止運行
  • catch:若前者出現異常,將捕獲異常並運行catch代碼
    若前者為出現異常,則無法捕獲異常,catch內代碼也不會運行
  • finally:無論是否出現異常,無差別運行finally內代碼

note that:
try內聲明的變量只能在try內部使用

示例:

public class DealException
{
    public static void main(String args[])
    {    
        try
        //要檢查的程序語句
        {
            int a[] = new int[5];
            a[10] = 7;//出現異常
        }
        catch(ArrayIndexOutOfBoundsException e)
        //異常發生時的處理語句
        {
            System.out.println("超出數組范圍!");
        }
        finally
        //這個代碼塊一定會被執行
        {
            System.out.println("*****");
        }
        System.out.println("異常處理結束!");
    }
}

Tips:

  1. 一個try語句可以對應多個catch語句
  2. 若存在多個catch語句,按照java.lang.Object類從子到父排列
  3. 一個catch語句可以捕捉多個異常,不同異常之間用|隔開
  4. 異常類聲明的對象默認被final修飾

拋出異常:throw

throw <$EX_OBJ>
其他異常拋出來自代碼邏輯,throw是主觀意願的手動拋出異常
兩者最終結果的作用相同
出現在函數體中,拋出異常后終止

聲明異常:throws

func throws <$EX_OBJ>
將自身異常提交給上級(調用者/JVM)
從而確保自身在編譯過程中不出現異常

自定義異常

  1. 創建類
  2. 繼承Exception或Exception的子類
  3. 重寫構造方法
    如何讓自定義異常發揮作用?
    依靠throw來拋出自定義的異常
public class NoMappingParamString extends Exception {
    //無參構造函數
    public NoMappingParamString(){
        super();
    }
    
    //用詳細信息指定一個異常
    public NoMappingParamString(String message){
        super(message);
    }
    
    //用指定的詳細信息和原因構造一個新的異常
    public NoMappingParamString(String message, Throwable cause){
        super(message,cause);
    }
    
    //用指定原因構造一個新的異常
    public NoMappingParamString(Throwable cause) {
        super(cause);
    }
}

Q&A

捕獲異常為什么不使用if&else,而是用try&catch&finally?**

  • 代碼臃腫
  • 處理繁瑣
  • 無法區分業務代碼和異常代碼

throw與throws的異同

相同:

  • throw與throws單詞類似
  • 后均跟異常類
  • 都是對異常的處理

不同:

  • throw是給自己創造困難從而磨煉自己
    throws是甩鍋給上級讓自己過的安穩
  • throw寫在結構體中,throws寫在聲明方法中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM