1. 程式人生 > >java 異常處理機制,throws與throw,try-catch-finally

java 異常處理機制,throws與throw,try-catch-finally

java 異常處理機制

  1. 在編寫程式時,經常要在可能出現錯誤的地方加上檢測的程式碼,如進行x/y運算時,要檢測分母為0,資料為空,輸入的不是資料而是字元等。過多的分支會導致程式的程式碼加長,可讀性差。因此採用異常機制。

1.Java異常處理

Java採用異常處理機制,將異常處理的程式程式碼集中在一起,與正常的程式程式碼分開,使得程式簡潔,並易於維護

  1. Java提供的是異常處理的抓拋模型。
  2. Java程式的執行過程中如出現異常,會生成一個異常類物件,該異常物件將被提交給Java執行時系統,這個過程稱為丟擲==(throw)==異常。
  3. 異常物件的生成
    1.由虛擬機器自動生成:程式執行過程中,虛擬機器檢測到程式發生了問題,如果在當前程式碼中沒有找到相應的處理程式,就會在後臺自動建立一個對應異常類的例項物件並丟擲——自動丟擲
    2.由開發人員手動建立:Exception exception = new ClassCastException();——建立好的異常物件不丟擲對程式沒有任何影響,和建立一個普通物件一樣
  4. 如果一個方法內丟擲異常,該異常物件會被拋給呼叫者方法中處理。如果異常沒有在呼叫者方法中處理,它繼續被拋給這個呼叫方法的上層方法。這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。
  5. 如果一個異常回到main()方法,並且main()也不處理,則程式執行終止。
  6. 程式設計師通常只能處理Exception,而對Error無能為力。
  7. 異常處理是通過try-catch-finally語句實現的。
try{
	......	//可能產生異常的程式碼
}
catch( ExceptionName1 e ){
	......	//當產生ExceptionName1型異常時的處置措施
}
catch( ExceptionName2 e ){
	...... 	//當產生ExceptionName2型異常時的處置措施
}  
[ finally{
	......	 //無論是否發生異常,都無條件執行的語句
		}  ]

  1. try
    捕獲異常的第一步是用try{…}語句塊選定捕獲異常的範圍,將可能出現異常的程式碼放在try語句塊中。
  2. catch (Exceptiontype e)
    在catch語句塊中是對異常物件進行處理的程式碼。每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同型別的異常物件。

    如果明確知道產生的是何種異常,可以用該異常類作為catch的引數;也可以用其父類作為catch的引數。
    比如:可以用ArithmeticException類作為引數的地方,就可以用RuntimeException類作為引數,或者用所有異常的父類Exception類作為引數。但不能是與ArithmeticException類無關的異常,如NullPointerException(catch中的語句將不會執行)。

  3. 注:try是一個獨立的程式碼塊,在其中定義的變數只在該變數塊中有效。
    如果在try以外繼續使用,需要在try建立引用。在try對其進行初始化。IO,Socket就會遇到。
  4. 捕獲異常的有關資訊:
    與其它物件一樣,可以訪問一個異常物件的成員變數或呼叫它的方法。
    getMessage() 獲取異常資訊,返回字串
    printStackTrace() 獲取異常類名和異常資訊,以及異常出現在程式中的位置。返回值void。
    資訊
  5. finally
    A.捕獲異常的最後一步是通過finally語句為異常處理提供一個統一的出口,使得在控制流轉到程式的其它部分以前,能夠對程式的狀態作統一的管理。
    B.不論在try程式碼塊中是否發生了異常事件,catch語句是否執行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執行。
    C.finally語句和catch語句是任選的
    D.處理過程:
    Try中檢測到異常會將異常物件傳遞給catch,catch捕獲到異常進行處理。
    Finally裡通常用來關閉資源。比如:資料庫資源,IO資源等。

2.try-catch-finally的程式流程圖

流程

3.關鍵解讀

排汙

4.demo

  1. 可以看我的其他部落格。

5.不捕獲異常時的情況

  1. 前面使用的異常都是RuntimeException類或是它的子類,這些類的異常的特點是:
    即使沒有使用try和catch捕獲,Java自己也能捕獲,並且編譯通過 ( 但執行時會發生異常使得程式執行終止 )。
  2. 如果丟擲的異常是IOException等型別的非執行時異常,則必須捕獲,否則編譯錯誤。也就是說,我們必須處理編譯時異常,將異常進行捕捉,轉化為執行時異常