Java之今天的異常處理了嗎
異常:指在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。
(這裏需要註意,異常字面上的意思就是異於平常的錯誤,這裏要和程序本身的設計錯誤區別開。筆者開始的時候一直在想如果一開始就知道程序會發生錯誤為啥還要執行它,不應該重新設計程序麽?)
異常發生後,Java會通過面向對象的方法來處理異常,也就是要把錯誤包裝成對象(這些對象都是可拋出的,即throw)。然後系統會在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理方法,這一過程稱為捕獲(catch)一個異常。
現在我們來看系統會拋出哪些異常:
在Java中,異常都繼承自java.lang.Throwable類,它有兩個直接子類:Error和Exception
1.Error類對象(如動態連接錯誤、硬件層面錯誤、JVM錯誤或內存不足等),由JVM生成並拋出。通常,Java程序不對這類異常進行處理,一般應用程序都無力回天。
2.Exception類對象,也就是我們通常看到的使用try、catch處理的錯誤,所以通常稱錯誤處理為異常處理(Exception handling)。它又分為運行時異常(Runtime Exception),代表運行時由Java虛擬機生成的異常,如算術運算異常ArithmeticException、數組越界異常ArrayIndexOutOfBoundsEXception等;其他則為非運行時異常,如輸入輸出異常IOException等。 Java編譯器要求Java程序必須捕獲或聲明所有的非運行時異常,但對運行時異常可以不做處理。
發生異常之後,處理方式有以下幾種:
對運行時異常可以不做處理;使用try-catch-finally語句捕獲異常;通過throws子句聲明異常,還可以定義自己的異常類,並用throw語句來拋出它。
1.運行時的異常:程序在運行時檢測到,它可能在程序的任意部位發生,而且其數目可能很大,此時系統會把生成的異常對象交給默認的異常處理程序,在標準輸出上顯示異常的內容以及發生異常的位置。
2.捕獲異常,即try-catch-finally:
try{
Java statements
}catch(ExceptionType1 ExceptionObject){
Exception Handling
}catch(ExceptionType2 ExceptionObject){
Exception Handling
}.....
}finally{
final Handling
}
try後用大括號{}指定一段代碼,表示該段代碼可能會拋出一個或多個異常;
catch語句的參數類似方法的聲明,包括一個異常類型和一個異常對象。,catch語句可以有一個或多個,而且至少有一個catch語句或finally語句;
finally語句可指定一塊代碼,無論try指定的程序拋不拋出異常,也不管catch語句的異常類型是否與所拋出的異常的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。
3.異常的拋出:通過throw語句來實現,格式為throw ThrowableObject;
其中ThrowableObject必須為Throwable類或其子類的對象。
也可以定義自己的異常類,並用throw語句來拋出它。關於throw的和throws的用法有很多值得去講的,筆者也會在下一篇中詳細描述。
總的看來,Java的異常處理機制把異常事件當作對象來處理,利用類的層次性可以把多個具有相同父類的異常統一處理,也可以區分不同的異常分別處理,使用靈活 。
但建議:1.異常控制的設計宗旨並不是用來代替一些簡單的測試
2.不要過分細化異常,以免造成資源浪費。
3.不要關閉異常
4.對於自定義的異常類,通常把它作為Exception類的子類,而非Error類的子類。且定義類名時常以Exception結尾。
對於異常處理機制的使用值得多思考,要做到在恰當的時候使用恰當的異常處理方式,而這些都是在實踐總結的基礎上才能得到自己的經驗啦!
Java之今天的異常處理了嗎