Java基礎——異常體系
阿新 • • 發佈:2022-04-29
- 在Java中,異常物件都是派生於Throwable類的一個例項,Java的異常體系如下圖所示:
所有的異常都是由Throwable繼承而來,在下一層立即分解為兩個分支,Error和Exception。
- Error錯誤:描述了Java執行時系統的內部錯誤和資源耗盡錯誤。一般是指虛擬機器相關的問題,如系統崩潰,虛擬機器出錯誤等,這種錯誤無法恢復或不可能捕獲,將導致應用程式中斷,通常不處理。因為如果出現這樣的內部錯誤,除了通告使用者,並盡力使程式安全地終止之外,再也無能為力了。
-
Exception異常:Java的異常分為兩種,checked Exception(編譯時異常)和 RuntimeException
- checked Exception(編譯時異常): Java認為checked Exception都是可以在編譯階段被處理的異常,一般是IOException和SQLException。所以它強制程式處理所有的checked Exception,而RuntimeException無須處理,java程式必須顯式處理checked Exception,如果程式沒有處理,則在編譯時會發生錯誤,無法通過編譯。用try{...}catch{...}finally{...}進行處理或throw和throws丟擲異常。
-
RuntimeException(執行時異常):這些異常一般是由程式邏輯錯誤引起的,一般都是程式設計師的錯,
- 出現執行時異常後,系統會自動把異常一直往上層拋(不需要程式設計師在程式碼中丟擲),一直遇到處理程式碼。如果沒有處理塊,到最上層,如果是多執行緒就由Thread.run()丟擲,如果是單執行緒就被main()丟擲。丟擲之後,如果是執行緒,這個執行緒也就退出了。如果是主程式丟擲的異常,那麼這整個程式也就退出了。執行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。
- 如果不想終止,則必須撲捉所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會執行時異常,或者是通過對異常的處理顯式的控制程式退出。
- Java異常處理方法有:丟擲異常,捕捉異常。主要依賴於try、catch、finally、throw、throws五個關鍵字。
- try:它裡面放置可能引發異常的程式碼
- catch:後面對應異常型別和一個程式碼塊,用於表明該catch塊用於處理這種型別的程式碼塊,可以有多個catch塊。
- finally:主要用於回收在try塊裡開啟的物力資源(如資料庫連線、網路連線和磁碟檔案),異常機制總是保證finally塊總是被執行。只有finally塊執行完成之後,才會回來執行try或者catch塊中的return或throw語句,如果finally中使用了return或者 throw等終止方法的語句,則就不會跳回執行,直接停止。
- throw:用於丟擲一個實際的異常,可以單獨作為語句使用,丟擲一個具體的異常物件。
- throws:用在方法簽名中,用於宣告該方法可能丟擲的異常
1 import java.io.IOException;
2
3 public class Test {
4
5 public static void main(String[] args) {
6 System.out.println("returning result is " + testException());
7 }
8
9 public static int testException(){
10 int i = 1 ;
11 try{
12 throw new IOException() ;
13 }catch(Exception e){
14 System.out.println("catch it !");
15 return i;
16 }finally{
17 i = 2 ;
18 System.out.println("finally ok") ;
19 System.out.println("i = " + i) ;
20 //return i ;
21 }
22 }
23 }
當第20行的return語句註釋掉時,輸出的結果是 catch it ! finally ok i = 2 returning result is 1 同時也表明如果try 或 catch 中有return語句,則在進入finally之前,Java的中間快取變數機制已經將try 或 catch 中返回的結果進行了快取,執行完finally中的語句後,直接將快取結果return,而當finally中有return語句時,則直接return當前的結果即可。 當第20行的return語句沒有註釋掉時,輸出的結果是 catch it ! finally ok i = 2 returning result is 2