Java 異常機制Exception和自定義異常
異常機制
異常:就是不符合實際需求,在實際中可能不存在也可能不滿足實際,所以出現的問題稱之為異常。
異常的三種類型:
- 檢查性異常:用戶錯誤或問題引起的異常,是程序員無法預見的。例如打開一個不存在的文件,就會發生一個檢查性異常。
- 運行時異常:是可能被程序員避免的異常,與檢查性異常相反,運行時異常可以在編譯是被忽略。
- 錯誤(ERROR):錯誤不是異常!錯誤是脫離瞭程序員的問題。一般不是程序員的問題。
異常體系結構
Java當中,萬物皆對象,Java將異常當作對象來處理,定義瞭一個基類(父類),java.lang.Throwable作為異常的超類。 java中的異常分為兩大類:錯誤(Error)和異常(Exception)。 錯誤: Error是由Java虛擬機產生並拋出的,大多數的錯誤與程序員是沒有關系的。 多數情況是Java虛擬機運行錯誤(Virtual MachineError),Java虛擬機將會終止線程。 這些錯誤是不可查的,因為在程序的控制能力之外。 異常: 在異常(Exception)分支中有一個重要的子類RuntimeException(運行時異常);
- ArrayIndexOutofBoundsException(數組下標越界異常)
- ClassNotFoundException(找不到類異常)
等異常是不檢查異常,程序可以選擇捕獲處理,也可以不處理。 這些異常通常是因為程序邏輯錯誤引起的,程序應該從邏輯角度盡可能的避免異常的發生。 錯誤(Error)與異常(Exception)的區別: Error通常是災難性致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)會選擇終止線程;Exception通常情況時可以被程序處理的,並且在程序中,盡可能的去處理和發現這些異常,這些異常通常是程序員的邏輯出現的問題。異常當中,RuntimeException(運行時異常),除此之外的異常統稱為非運行時異常。註意的是錯誤就是錯誤,異常可以分為運行時異常和非運行時異常。
異常的捕獲與拋出
- 拋出異常
- 捕獲異常
異常處理的5個關鍵字:
- try(嘗試著去處理,試一試的意思)、catch(捕獲)、finally(是否執行都會走到這個語句當中)、throw(拋出異常)、throws(拋出異常)。
捕獲並拋出異常: 舉例:數組下標越界異常處理:
正如上圖所示,並別有輸出數組下標的元素,因為元素本身就不存在,產生異常,所以將異常進行捕獲並進行瞭拋出。 值得註意的是在普通異常當中,可以不使用finally,但是try與catch是必須要的,必不可少的,finally在IO流當中可以明顯的發現它的作用。比如說在Scanner當中,需要關閉用戶輸入(scanner.close()),那麼finally就起到瞭很重要的作用。 值得註意的是異常的基類,Throwable是所有異常的父類,
如下圖所示:
catch (Error e)中,括號裡面的Error為想要捕獲的異常類型,e為一個變量。 在Java當中可以捕獲多個異常,Java中進行瞭提供,如下圖所示(當程序中可能出現多個異常時): 下圖中我們可以得到結果,該程序是一個異常,而不是一個錯誤!
下面的代碼就好像一個循環,如果程序中可能將會出現多個異常,那麼就可以在下面的語句中實現,切記的是異常基類可以放在最後。
try{ }catch(){ System.out.println(); }catch(){ System.out.println(); }finally{ }
下圖中是捕獲多個異常,但是將異常的基類放在瞭第一個,導致程序報錯,所以後面的捕獲失去瞭意義導致報錯。所以異常的基類應該放在最後!
註意:我們可以看到上圖中出現報錯,是因為異常的捕獲需要從小到大,但是第一個直接就放瞭一個最大的基類,所以出現報錯。如果說需要捕獲多個異常,那麼需要從小到大類捕獲。 try-catch快捷鍵的使用:選中需要try的部分:ctrl+alt+T,
如下圖所示:
假如說程序出現異常,我們可以讓程序運行結束或者說是退出:
上面的括號中的數字,任意即可,表示程序異常時退出程序! 在異常當中,我們可以主動的去判斷是否有異常,然後再進行拋出異常。
如下圖(主動拋出異常):
異常的主動拋出一般在方法當中使用!如下圖所示:
如果我們知道會有異常,上面的方法又處理不掉異常,那麼可以在方法上拋出異常。
如下圖所示: 註意:在方法中拋出異常使用throw,但是在方法上使用throws!
在方法體中沒有解決掉異常的拋出,在方法上拋出異常,拋出異常後如果不使用try-catch,那麼程序就不會繼續執行。使用try-catch後,程序仍然會繼續執行。
使用try-catch時:
不使用try-catch時:
自定義異常
使用Java內置的異常類可以描述在編程時出現的大部分異常,但是,用戶還可以自定義異常。用戶自定義異常類,隻需要繼承Exception。
自定義異常步驟如下:
- 創建自定義的異常類;
- 在方法當中通過throw關鍵字拋出異常對象;
- 如果在當前拋出異常的方法當中處理異常,可以使用try-catch語句捕獲並進行處理;否則在方法的聲明語句當中通過throws關鍵字指明拋出給方法調用者的異常,繼續執行下一步操作;
- 在出現異常方法的調用者中捕獲並處理異常。
自定義異常類的書寫,在書寫的過程當中,或許我們隻知道需要繼承Exception,但是當繼承之後無法入手,我們可以通過看一下異常處理的一些方法,如下圖所示: 第一步:
第二步:傳入一個符合程序,不會拋出異常的值;
第三步:打印一個不符合程序設定的值,拋出異常;
總圖: 1.拋出異常的圖:
2.沒有拋出異常的圖:
總結:
- 運行時處理異常,采用邏輯合理規避,使用try-catch處理;
- 盡可能的使用finally語句塊去釋放占用的資源;
- 異常需要盡可能的去處理,不要簡單的打印輸出;
- 對於潛在的異常,可以使用try-catch處理潛在的異常,還有不確定的代碼可以使用try-catch進行規避;
- 具體的如何去處理異常,根據不同的業務需求和異常情況去進行合理的異常。
到此這篇關於Java 異常機制Exception+自定義異常的文章就介紹到這瞭,更多相關Java Exception內容請搜索LevelAH以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持LevelAH!
推薦閱讀:
- Java異常處理操作 Throwable、Exception、Error
- 超詳細講解Java異常
- Java異常Exception詳細講解
- 簡述Java中throw-throws異常拋出
- Java異常(Exception)處理以及常見異常總結