Java異常

Java-高階勸退師發表於2020-11-08

一、異常繼承結構


Error錯誤,一般指虛擬機器相關的問題,如系統崩潰、虛擬機器出錯誤等,應用程式無法處理這些錯誤

一般說的異常處理指的是Exception


二、使用finally回收資源

除非在try塊、catch塊中呼叫了退出虛擬機器的方法(System.exit(0)),否則不管在try塊、catch塊中執行怎樣的程式碼,出現怎樣的情況,異常處理的finally總會被執行


三、Checked異常和Runtime異常體系

不是RuntimeException類及其子類的異常被稱為Checked異常;

只有Java提供了Cheched異常,Checked異常體現了Java的設計哲學:沒有完善錯誤處理的程式碼根本不會被執行;

       Checked異常的處理有兩種:(1)try....catch(2)定義方法時宣告丟擲該異常


四、使用throws丟擲異常

當前方法不知道應該如何處理這種異常,應該有上一級呼叫者處理;如果main方法不知道應該如何處理這種異常,也可以使用throws宣告丟擲異常,該異常將交給JVM進行處理(列印異常跟蹤站資訊、並終止程式執行)。 throws可以丟擲多個可能存在的異常


五、使用throw丟擲異常

當程式出現錯誤時,系統會自動丟擲異常;除此之外,Java也允許程式自行丟擲異常,自行丟擲異常使用throw語句完成,throw語句丟擲的不是異常類,而是一個異常例項,而且每次只能丟擲一個異常例項

try{
	if("有錯誤"){//是應用程式錯誤,不是系統錯誤
		throw new Exception("....");
	}
}
catch(Exception e){
	....
}
如果throw語句丟擲的異常是Checked異常,則該throw語句要麼處於try塊中,顯示抓捕該異常,要麼放在一個帶throws宣告丟擲的方法裡,即把該異常交給該方法的呼叫者處理


finally塊裡面的程式碼什麼時候被執行?

 (1)finally保證無論出現什麼情況,finally塊裡面的程式碼總會被執行,因此一般用來回收資源;

   (2)當tr、catch都有return語句時,先執行finally裡面的程式碼,然後執行try裡面的return

finally塊是不是一定會執行?

     不一定會執行。

(1)當程式進入try語句之前就有異常時,會直接結束

int i=5/0;//出現異常,沒有執行try塊
try{}
catch(){}
finally{}
(2)當程式在try塊中強制退出也不會去執行finally塊中的內容

try{
     System.exit(0);
}
catch(){}
finally{}//finally塊沒有被執行


Error與Exception的區別

     Error表示程式在執行期間出現了非常嚴重的錯誤,並且錯誤是不可以恢復的,屬於JVM層次的嚴重錯誤,編譯器不會去檢查Error是否被處理,會導致程式終止執行。如OutOfMemoryError、ThreadDeath等錯誤;   Exception表示可以恢復的異常,是編譯器可以捕捉到的,包括Runtime exception和Checked exception

 

checked異常和Runtime異常的區別

      checked 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。

      runtime exception,也稱執行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機器接管。出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼。如果沒有處理塊,到最上層,如果是多執行緒就由Thread.run()丟擲,如果是單執行緒就被main()丟擲丟擲之後,如果是執行緒,這個執行緒也就退出了。如果是主程式丟擲的異常,那麼這整個程式也就退出了

      如果不想終止,則必須撲捉所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會執行時異常,或者是通過對異常的處理顯式的控制程式退出。