原文地址:http://yangshen998.iteye.com/blog/1311682
[html] view plain copy public class ExceptionTypeTest { public void doSomething() throws ArithmeticException{ System.out.println(); } public static void main(){ ExceptionTypeTest ett = new ExceptionTypeTest(); ett.doSomething(); } }
問題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 try{ //可能會出現異常的程式碼片段; }catch(異常類型1 變數名){ //處理指定類型的異常 //對該類型異常的處理程式碼片段; e.printStackTrace(); }catch(){ }[finally{ //無論是否發生異常都要執行的程式碼片段; //經常用來清理資源 }]
2).向上聲明:用throws關鍵字,向外聲明(合理的處理方法)
聲明本方法可能會拋出的異常列表。
...方法名(參數列表) throws 異常類型1,異常類型2
向上聲明是告訴本方法的調用者,在使用本方法時,應該對這些異常進行處理。
6.手動拋出一個異常:當程式邏輯不符合期望時,要中止後面代碼的執行時。
在方法的程式碼片段中,可以使用throw關鍵字手動拋出一個異常。
注意:如果手動拋出的是受檢異常,那麼本方法必須進行處理(應該採用向上聲明這個異常);如果手動拋出的是非受檢異常,那麼可以進行處理,也可以不處理。
可以繼承Exception來定義一個受檢異常。也可以繼承自RuntimeException或其子類來定義一個非受檢異常。
8.異常概括:一個圖兩種處理方式.
觀察拋出的異常的名字和行號很重要。
應該捕獲和處理那些已知如何處理的異常,傳遞那些不知如何處理的異常。
盡量減少try語句塊的體積。
[html] view plain copy for(int i=1;i<=1000;i++){ try{ ... }catch(...) }不合理 盡量減少try-catch語句的嵌套
在catch塊程式碼片段中,應該列印除該異常的堆疊追蹤資訊以方便調試。
throws可以聲明方法可能會拋出一個或多個異常,異常之間用','隔開
如果聲明的可能會拋出的異常是非受檢的,該方法的調用者可以處理也可以不處理。
如果聲明的可能會拋出的異常是受檢的,該方法的調用者必須進行處理。
如果手動拋出的異常是一個受檢異常,那麼必須進行處理
處理方式有兩種:
1.顯示用try/catch進行處理(不合理)
2.用throws向外聲明(合理的處理方法)
*****************************************************************************************************************
異常處理(Exception)
2.異常的處理機制:
3.異常的分類:
4.常見異常:
7.自訂異常:當需要一些跟特定業務相關的異常資訊類時。
9.異常實踐:
使用 throws關鍵字來聲明方法可能會拋出的異常
用throw關鍵字來手動拋出一個異常,
應捕獲和處理那些已知如何處理的異常,而傳遞那些不知如何處理的異常。