天天看點

java基礎總結之java異常

java異常繼承圖

java基礎總結之java異常
  • Throwable 類是 Java 語言中所有錯誤或異常的超類。隻有當對象是此類(或其子類之一)的執行個體時,才能通過 Java 虛拟機或者 Java throw 語句抛出。類似地,隻有此類或其子類之一才可以是 catch 子句中的參數類型。 (來自jdk文檔)
  • Error一般是程式或者系統中比較嚴重的錯誤,隻能通過重寫代碼等去解決。
  • 異常又分為編譯時異常(eg:ClassNotFoundException類找不到異常,FileNotFoundException檔案找不到異常,SQLException sql異常等)和運作時異常(NullPointerException空指針異常,AirthmeticException運算非法異常,IndexOutOfBoundsException數組越界異常等)。
  • 除了RuntimeException類及其之類外,所有的異常都是編譯期異常,編譯期的異常是我們必須進行顯示處理的,如果不處理程式就無法繼續編譯執行。
  • 運作期異常,我們可以不進行顯示處理,也可以進行顯示處理,不會影響程式的編譯。如下圖中的異常是可以通過編譯的,在運作時才會報出錯誤。
    java基礎總結之java異常
  • 我是這樣了解運作時異常的,運作時異常就相當于一些小錯誤,不至于導緻系統崩潰,隻要我們在寫代碼時足夠的嚴謹,就可以避免這些錯誤。(例如以下的代碼,我們在進行除法運算之前,先判斷除數是否為0,不為0才進行運算,這樣就可以避免除數為0帶來的錯誤)
    java基礎總結之java異常
  • JVM對異常的處理:

    如果在程式中出現問題,而我們不去處理,最終會由jvm做出預設的處理(把異常的名稱,原因,問題相關的資訊列印在控制台,同時結束程式),當我們對可能出現異常的部分進行了異常處理,那麼程式就會繼續運作下去。如下圖,我們對做除法運算的語句進行了異常處理,它後面的代碼int d=a+b正常的執行了,并且printStackTrace()方法給出了錯誤的資訊。

    java基礎總結之java異常

異常的處理方案:

  • 1.throws抛出異常
  • 2.try…catch捕獲異常
  • try …catch語句通常寫法:
try {
			//可能出現問題的語句代碼
		}catch (異常名 變量) {
			//針對問題的處理
		}finally {
			//必須執行的代碼(如:釋放資源)
		}
           
  • 當需要處理多個異常時的變形寫法:
try {
			//可能出現問題的語句代碼
			//語句1
			//語句2
		}catch (異常名 變量) {
			//針對問題的處理
		}catch(異常名 變量){
			//針對問題的處理
		}
		...
           

注意:

  • try裡面的語句越少越好
  • catch裡面必須有内容,至少有簡單點的提示語句
  • 在catch中異常名寫的原則:能明确的異常不要寫其父類的異常名。
  • 多個catch之間平級的異常先後順序沒有關系,但是當出現父子關系時,父類的異常寫在最後。
  • 存在多個catch的執行規則:一旦try裡面的語句出現錯誤,就會将問題抛出去,和catch裡面的異常進行比對,執行catch裡面的處理,然後try…catch就結束了,轉而執行後面的代碼。(如上面的語句1出現了問題,就會找對應的catch塊,語句2就得不到執行)
  • 變形寫法2:(jdk1.7後)
try {

		}catch (異常名1|異常名2|異常名3|...) {
		
		}
           

這種寫法異常名之間必須是平級的關系。

throws處理方式:

  • 一般當我們沒有權限或者我們處理不了某些異常時,才會選擇使用throws的方案。
  • 使用方法:在方法的聲明上抛出,用于告訴調用者,我這裡出現問題了,并由調用者來處理該異常。如下所示:
public void method() throws Exception{
		
}
           
  • throw和throws的差別:

    throws 用在方法聲明後,可以跟多個異常名,表示将異常抛出,由方法的調用者來處理。throws表示出現異常的一種可能性,并不一定發生這種異常。

    throw 在方法體内抛出,跟異常名對象,隻能一個,表示抛出異常,執行throw則一定抛出了某種異常。

public class MyException {

	public void method(){

		int a = 10;
		int b = 0;
		if (b == 0)
			throw new ArithmeticException();
		else
			System.out.println(a/b);
	}

	public static void main(String[] args) {

		MyException me=new MyException();
		me.method();

	}
}

           

運作結果:

java基礎總結之java異常
  • finally

    被finally控制的語句一定執行(但如果在finally執行之前jvm就退出了,finally中的代碼不會被執行)

(個人學習總結,僅供參考,有錯請指正,謝謝)

繼續閱讀