天天看點

Java 檢查異常與非檢查異常

原文位址:http://yangshen998.iteye.com/blog/1311682

[html]  view plain  copy

  1. public class ExceptionTypeTest {  
  2. public void doSomething() throws ArithmeticException{  
  3. System.out.println();  
  4. }  
  5. public static void main(){  
  6. ExceptionTypeTest ett = new ExceptionTypeTest();  
  7. ett.doSomething();  
  8. }  
  9. }  

問題1:上面的程式能否編譯通過?并說明理由。

解答:能編譯通過。分析:按照一般常理,定義doSomething方法是定義了ArithmeticException異常,在main方法裡面調用了該方法。那麼應當繼續抛出或者捕獲一下。但是ArithmeticException異常是繼承RuntimeException運作時異常。 Java裡面異常分為兩大類:checkedexception(檢查異常)和unchecked exception(未檢查異常),對于未檢查異常也叫RuntimeException(運作時異常),對于運作時異常,java編譯器不要求你一定要把它捕獲或者一定要繼續抛出,但是對checkedexception(檢查異常)要求你必須要在方法裡面或者捕獲或者繼續抛出。

問題2:上面的程式将ArithmeticException改為IOException能否編譯通過?并說明理由。

解答:不能編譯通過。分析:IOException extends Exception 是屬于checked exception,必須進行處理,或者必須捕獲或者必須抛出。

總結:java中異常分為兩類:checked exception(檢查異常)和unchecked exception(未檢查異常),對于未檢查異常也叫RuntimeException(運作時異常).

對未檢查的異常(unchecked exception )的幾種處理方式:

1、捕獲

2、繼續抛出

3、不處理

對檢查的異常(checked exception,除了RuntimeException,其他的異常都是checked exception )的幾種處理方式:

1、繼續抛出,消極的方法,一直可以抛到java虛拟機來處理

2、用try...catch捕獲

注意,對于檢查的異常必須處理,或者必須捕獲或者必須抛出

1.異常:程式再運作期間發生的不正常事件,它會打斷指令的正常流程。

異常都是發生在程式的運作期,編譯出現的問題叫文法錯誤。

1)當程式再運作過程中出現了異常,JVM自動建立一個該類型的異常對象。同時把這個異常對象交給運作時系統。(抛出異常)

2)運作時系統接受到一個異常對象時,它會在産生異常的代碼附近查找相應的處理方式。

3)異常的處理方式有兩種:

1.捕獲并處理:在異常的代碼附近顯式用try/catch進行處理(不合理),運作時系統捕獲後會查詢相應的catch處理塊,再catch處理塊中對該異常進行處理。

2.檢視發生異常的方法是否有向上聲明異常,有向上聲明,向上級查詢處理語句,如果沒有向上聲明,JVM中斷程式的運作并處理。用throws向外聲明(合理的處理方法)

java.lang.Throwable

|-- Error錯誤:JVM内部的嚴重問題。無法恢複。程式人員不用處理。

|--Exception異常:普通的問題。通過合理的處理,程式還可以回到正常執行流程。要求程式設計人員要進行處理。

|--RuntimeException:也叫非受檢異常(unchecked exception).這類異常是程式設計人員的邏輯問題。應該承擔責任。Java編譯器不進行強制要求處理。 也就是說,這類異常在程式中,可以進行處理,也可以不處理。

|--非RuntimeException:也叫受檢異常(checked exception).這類異常是由一些外部的偶然因素所引起的。Java編譯器強制要求處理。也就是說,程式必須進行對這類異常進行處理。

1)非受檢的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,ArithmeticException(算術異常,除0溢出)

2)受檢:Exception,FileNotFoundException,IOException,SQLException.

5.異常處理的兩種方式:

1).顯示用try/catch進行處理(不合理)

[html]  view plain  copy

  1. try{  
  2. //可能會出現異常的代碼段;  
  3. }catch(異常類型1 變量名){ //處理指定類型的異常  
  4. //對該類型異常的處理代碼段;  
  5. e.printStackTrace();  
  6. }catch(){  
  7. }[finally{  
  8. //無論是否發生異常都要執行的代碼段;  
  9. //經常用來清理資源  
  10. }]  

2).向上聲明:用throws關鍵字,向外聲明(合理的處理方法)

聲明本方法可能會抛出的異常清單。

...方法名(參數清單) throws 異常類型1,異常類型2

向上聲明是告訴本方法的調用者,在使用本方法時,應該對這些異常進行處理。

6.手動抛出一個異常:當程式邏輯不符合期望時,要中止後面代碼的執行時。

在方法的代碼段中,可以使用throw關鍵字手動抛出一個異常。

注意:如果手動抛出的是受檢異常,那麼本方法必須進行處理(應該采用向上聲明這個異常);如果手動抛出的是非受檢異常,那麼可以進行處理,也可以不處理。

可以繼承Exception來定義一個受檢異常。也可以繼承自RuntimeException或其子類來定義一個非受檢異常。

8.異常概括:一個圖兩種處理方式.

觀察抛出的異常的名字和行号很重要。

應該捕獲和處理那些已知如何處理的異常,傳遞那些不知如何處理的異常。

盡量減少try語句塊的體積。

[html]  view plain  copy

  1. for(int i=1;i<=1000;i++){  
  2. try{  
  3. ...  
  4. }catch(...)  
  5. }不合理  
  6. 盡量減少try-catch語句的嵌套  

在catch塊代碼段中,應該列印除該異常的堆棧跟蹤資訊以友善調試。

throws可以聲明方法可能會抛出一個或多個異常,異常之間用','隔開

如果聲明的可能會抛出的異常是非受檢的,該方法的調用者可以處理也可以不處理。

如果聲明的可能會抛出的異常是受檢的,該方法的調用者必須進行處理。

如果手動抛出的異常是一個受檢異常,那麼必須進行處理

處理方式有兩種:

1.顯示用try/catch進行處理(不合理)

2.用throws向外聲明(合理的處理方法)

*****************************************************************************************************************

異常處理(Exception)

2.異常的處理機制:

3.異常的分類:

4.常見異常:

7.自定義異常:當需要一些跟特定業務相關的異常資訊類時。

9.異常實踐:

使用 throws關鍵字來聲明方法可能會抛出的異常

用throw關鍵字來手動抛出一個異常,

應捕獲和處理那些已知如何處理的異常,而傳遞那些不知如何處理的異常。