目錄
一、運行時異常 1、什麼是RuntimeExceptioin 2、運行時異常的特點 3、如何運用運行時異常 二、運行時異常和ckecked異常的區別 1、機制上 2、邏輯上
一、運行時異常
1、什麼是運行時異常
程式在運行過程中出現的異常,RumtimeException 是 Exception 的一個子類
我們可以查看Java API 文檔
貼張示意圖
2、運行異常的特點
一般來說,我們在方法體內出現異常,我們用throw 關鍵字 將 異常對象或 異常對象的引用拋出,如果當前方法無法處理異常,那麼必須在方法的參數列表後方法體前 必須 用 throws 聲明異常所屬類,交給調用者去處理。但是RuntimeException是非常特殊的子類,你可以不用throw和throws,哪怕你throw了,也沒必要thtows,即使你throws了,調用者也沒必要try-catch
1> 如果在函數內容中拋出該類異常或其子類異常,函數上可以不用聲明,編譯一樣通過
2> 如果在函數上聲明該異常,調用者可以不同處理(try-catch),編譯一樣通過
為什麼不用聲明 。
之所以不用在函數上聲明,是因為不需要讓調用者處理,當該異常發生,希望程式停止,因為在運行時,出現了無法繼續運算的情況,希望程式停止後由程式員對代碼進行修正。
3、如何運用運行時異常
自訂異常時,如果該異常的發生,無法繼續進行運行,就讓自訂異常類繼承RuntimeException
再貼一張簡單示意圖 Object 中的 wait(long timeout)方法,繼續查看Java API 文檔 對該方法的描述
二、運行時異常和ckecked異常的區別
對於異常分兩種:檢查異常和非檢查異常(運行時異常)
檢查異常 : 編譯時間被檢測的異常 (throw後,方法有能力處理就try-catch處理,沒能力處理就必須throws)。編譯不通過,檢查文法(其實就是throw和throws的配套使用)。
運行時異常 : 編譯時間不被檢查的異常(運行時異常。RuntimeException及其子類)。編譯通過。
1、機制上
主要表現在以下兩個方面 :
(1)如何定義方法
(2)如何處理拋出的異常
運行時異常,不需要用throws 聲明拋出 異常對象所屬類,也可以不用throw 拋出異常對象或異常引用。對於調用該方法,也不需要放於 try-catch 代碼塊中。(為什麼 。 如果你捕獲它,就會冒這麼一個風險:程式碼錯誤被掩蓋在運行中無法察覺)
而檢查異常 : 一旦 用throw 拋出異常,如果當前方法 可處理異常,那麼直接在該方法內用try-catch 去處理。如果當前方法不具備處理該異常的能力,那麼就必須在 參數列表後方法體前用 throws 聲明 異常 所屬類,交給調用該方法的 調用者(方法) 去處理 。
2、邏輯上
從邏輯的角度來看, checked 異常 和 RuntimeException 有著不同的使用目的,檢查性異常 用來指示 一種調用方能夠直接處理的異常情況(例如: 使用者輸入錯誤,程式可以直接捕獲並處理,提示使用者輸入錯誤), 而RuntimeException 是用來指 調用方 本身無法 處理或回複 的程式錯誤(例如,你封裝個庫給別人用,當別人調用你庫中某個方法是,需要傳入某些參數,如果使用者傳入的參數不合法,你自己沒辦法處理,那麼刺客你拋出的就應該是運行時異常)。
我個人感覺,RuntimeException 跟OC 中的 斷言(NSAlert) 有點像哦。
進一步思考 : 前面的知識點有降到,攜帶參數的構造方法既可以為對象賦初始值,還可以為對象 賦一個合理的值。例如,初始化一個長方形對象,用構造方法給定 width 和 length ,我們可以在構造方法裡面判斷 長 寬 值的合理性,但是如果此時你初始化這個對象成功後,你調用 求面積的方法,返回一個 值,那麼這個值 是異常值。按照所學的知識,我們一般會在求面積的方法,判斷值的合理性,如果不合理拋出異常。但是,反過來想,如果我一開始讓你傳入 的 width 和 length 就拋出異常呢,這個直接讓你初始化對象不成功 是不是好點。因為你有可能不知道 我 求面積的方法是怎麼實現的,就算我給你拋出異常,你也不知道如何處理。(通過這點,我們也瞭解到一個小知識點,構造方法也是可以拋出異常的,而且,拋出異常的類型通常是運行時異常)