《疯狂Java讲义》10
1.?Java的異常機制主要依賴于try、catch、finally、throw和throws五個關鍵字。? ??
2.Java的異常分為兩種,Checked異常和Runtime異常,Java認為Checked異常是在編譯時可以處理的異常,所以它強制Java處理所有的Checked異常,而Runtime異常無需處理.
3.?使用try...catch來捕獲異常:
????語法結構為如下:
?
4.?如果執行try塊中的代碼出現了異常情況,系統會自動生成一個異常對象,該異常對象被提交給Java運行時環境,這個過程稱為拋出異常。當Java運行時環境接受到這個異常時,會尋找處理該對象的Catch塊,如果找到合適的catch塊,就把對象交給這個catch快進行處理,這個過程稱為捕獲異常,當然了,如果沒有找到合適的catch塊,那么程序將終止。
5.?程序在執行try中的代碼時,如果遇到異常,就會產生Exception,上面也提到了,會調用合適的catch來進行處理。這里要說明的是,每一個可以接收的異常都有自己相對應的catch語句,也就是有唯一性。
6.?Java把所有的非正常情況分為兩種,一種是異常(Exception),一種是錯誤(Error)。Error錯誤一般是指與虛擬機相關的問題,如系統崩潰、虛擬機錯誤、動態鏈接失效等。這種錯誤無法恢復或不可能捕獲,將導致應用程序中斷,因此應用程序不應該試圖使用catch塊來捕獲Error對象。
7. try語句與if語句的區別:
????try和catch語句后面的花括號不能省略,但是if后面如果只有一行語句,花括號是可以省略的。
8. 看一個捕獲異常的栗子:? ?
寫法就是醬紫的。紅框框出來的是try和catch的用法栗子,紫色的框出來的是之前我們講過的Scanner的用法。
給大家看一下結果:
示例1:
示例2:
換一種輸入方法:
我們再試試捕獲不同異常:
示例3:
如果把括號內的數據換成:
結果為(示例4):
????上面的幾種異常處理較為常見,熟悉最好。
?
9.?捕獲異常時,注意先捕獲小異常,再捕獲大異常。就是說,范圍大些的放在程序的后面,更為具體的放在前面。用上面的例子來說,就是將
????紅框內的內容往后放,因為這個包含的情況很多,上面的都比較具體,所以先小后大。再例如:運行時異常應該放在空指針異常的后面。
?
10. Java7提供的多異常捕獲
????在Java7之前,每個catch只能捕獲一種異常,但是Java7之后,一個catch塊可以捕獲多種異常。
先看一下示例吧:
上面和之前的代碼一樣,結果如下:
這就是多異常捕獲,需要注意的兩點是:
(1)書寫問題:多個異常中間用“|”隔開:
(2)捕獲多種類型的異常時,異常變量有隱式的final修飾,因此程序變量不能對異常變量重新賦值。
舉個栗子:
看一下編譯信息:
但是如果是只捕獲一種異常變量的話,就可以重新賦值:
編譯沒有問題。
?
11. 訪問異常信息
(下面烏拉烏拉一堆字可以都不看,吃栗子)
????如果程序需要在catch塊中訪問異常對象的相關信息,則可以通過訪問catch塊的后異常形參來獲得。當Java運行時決定調用某個catch塊來處理該異常對象時,會將異常對象賦值給catch塊后的異常參數,程序就可以通過該參數獲得異常的相關信息。
來~栗子:
?
結果如下:
????所有的異常對象都包含了如下幾個常用的方法:
????1)getMessage():返回該異常的詳細描述字符串;
????2)printStackTrace():將該異常的跟蹤棧信息輸出到標準錯誤輸出。
????3)printStackTrace(PrintStream s):將該異常的跟蹤棧信息輸出到指定輸出流;
????4)getStackTrace():返回該異常的跟蹤棧信息。
?
12. 使用finally回收資源
(下面的字可以只看粗體)
????如果程序在try中打開了物理資源(例如數據庫連接,網絡連接和磁盤文件等),這些物理資源必須顯示回收。之前我們講垃圾回收機制的時候說過,系統只能自動回收一些內存中的對象所占用的內存,不能回收物理資源。所以怎么辦?如果在try或者catch中進行回收處理,程序可能得不到執行,所以我們不能放在這兩個地方。為了解決這個問題,異常處理機制提供了finally塊,不論是否出現異常,finally都會執行。多個catch塊放在try之后,finally塊放在catch塊之后。
來~栗子:
?
結果如下:
?再來~栗子:
?
在上面的try里稍作改動,如上圖。結果不變。這說明什么?我們印象中的return還是比較厲害的,一般方法執行到return都會結束,但是這里并沒有結束,finally還是會繼續執行,這里要注意一下。但是并不是說我們對finally無可奈何了。
又來~栗子:
?
這個語句含義是退出虛擬機,所以程序不會執行finally塊,結果如下:
13.?上面我們說到可以用finally塊對物理資源進行回收,但是也可以看到,代碼量會增加很多。Java7后,提供了一種看起來較為簡單的方法,看例子:
但是,說實話,我不喜歡這個寫法,可能以后是得這么用,但是,,,以后再說(傲嬌臉.jpg || 傲嬌臉.gif)
?
14. 使用throws聲明拋出異常
????使用throws聲明拋出異常的思路是:當前方法不知道如何處理異常,交給上一級去處理。如果main方法不知道如何處理,也可以使用throws聲明拋出異常,交給虛擬機處理。虛擬機處理的方式是打印異常的跟蹤棧信息,并終止程序運行(就是我們上面舉過的例子)。
????throws聲明拋出異常的語法格式為:
? ? throws ExceptionClass1,ExceptionClass2...
用throws的話就不用try...catch了。
舉個栗子:
?
這個程序結果和我們之前用try...catch的結果是一樣的。
?
END
?
??
?
總結
以上是生活随笔為你收集整理的《疯狂Java讲义》10的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《疯狂Java讲义》9
- 下一篇: 《疯狂Java讲义》11