概念 采用新的異常處理機制
在以往的程序開發過程中
常常采用返回值進行處理
例如
在編寫一個方法
可以返回一個狀態代碼
調用者根據狀態代碼判斷出錯與否
若狀態代碼表示一個錯誤
則調用這進行相應的處理
或顯示一個錯誤頁面或錯誤信息
通過返回值進行處理的方法是有效的
但是有它的許多不足之處
程序復雜
可靠性差
返回信息有限
返回代碼標准化困難
采用錯誤代碼和異常處理相結合的方式的優越性
把錯誤代碼與常規代碼分開
可以在catch中傳播錯誤信息
可以對錯誤類型分組
方便定位錯誤
維護
異常
異常就是異常事件
它是程序遇到異常情況所激發的事件
許多異常
如程序錯誤
空指針
數組溢出等
下面是一個出錯流程
第一步
插入用戶的Keynet
登錄系統
第二步
服務器驗證用戶的身份
判斷用戶的權限
第三步
返回錯誤的信息
這是一個簡單的異常處理示例
怎樣簡單
方便
快捷的得到錯誤信息
可以采用錯誤代碼和異常兩種方式相結合的方式處理
異常處理 Java的異常是面向對象的
一個Java的Exception是一個描述異常情況的對象
當出現異常情況時
一個Exception對象就產生了
並放到異常的成員函數裡
Java的異常處理是通過
個關鍵詞來實現的
try
catch
throw
throws和finally
在Java語言的錯誤處理結構由try
catch
finally三個塊組成
其中try塊存放將可能發生異常的Java語言
並管理相關的異常指針
catch塊緊跟在try塊後面
用來激發被捕獲的異常
finally塊包含清除程序沒有釋放的資源
句柄等
不管try塊中的代碼如何退出
都將執行finally塊
try… catch… 塊
可以采用try來指定一塊預防所有異常的程序
緊跟在try程序塊後面
應包含一個
或多個catch子句來指定你想要捕獲的異常類型
try catch的格式一般為
try{
/**do something*/
}catch(…){
…
}catch(…){
…
}
例如
try{
int a=
/
}catch(Exception e){
System
out
println(e
getMessage());
}
每當Java程序激發一個異常時
它實際上是激發了一個對象
而只有其超類為Throwable類的對象才能被激發
Throwable類中的提供了一些方法
如
其中的getMessage()方法打印出異常對應信息
Catch子句的目標是解決異常情況
把變量設到合理的狀態
並象沒有出錯一樣繼續運行
如果一個子程序不處理沒個異常
則返回到上一級處理
如此可以不斷的遞歸向上直到最外一級
finally 塊
finally 關鍵字是對 Java 異常處理模型的最佳補充
finally 結構使代碼總會執行
而不管有無異常發生
使用 finally 可以維護對象的內部狀態
並可以清理非內存資源
如果沒有 finally
您的代碼就會很費解
例如
下面的代碼說明
在不使用 finally 的情況下您必須如何編寫代碼來釋放非內存資源
import
*;
import java
io
*;
class WithoutFinally
{
public void foo() throws IOException
{
//在任一個空閒的端口上創建一個套接字
ServerSocket ss = new ServerSocket(
);
try {
Socket socket = ss
accept();
//此處的其他代碼
}
catch (IOException e) {
ss
close(); //
throw e;
}
//
ss
close(); //
}
}
這段代碼創建了一個套接字
並調用 accept 方法
在退出該方法之前
您必須關閉此套接字
以避免資源漏洞
為了完成這一任務
我們在 //
處調用 close
它是該方法的最後一條語句
但是
如果 try 塊中發生一個異常會怎麼樣呢?在這種情況下
//
處的 close 調用永遠不會發生
因此
您必須捕獲這個異常
並在重新發出這個異常之前在 //
處插入對 close 的另一個調用
這樣就可以確保在退出該方法之前關閉套接字
這樣編寫代碼既麻煩又易於出錯
但在沒有 finally 的情況下這是必不可少的
不幸的是
在沒有 finally 機制的語言中
程序員就可能忘記以這種方式組織他們的代碼
從而導致資源漏洞
Java 中的 finally 子句解決了這個問題
有了 finally
前面的代碼就可以重寫為以下的形式
import
*;
import java
io
*;
class WithFinally
{
public void foo
() throws IOException
{
//在任一個空閒的端口上創建一個套接字
ServerSocket ss = new ServerSocket(
);
try {
Socket socket = ss
accept();
//此處的其他代碼
}
finally {
ss
close();
}
}
}
finally 塊確保 close 方法總被執行
而不管 try 塊內是否發出異常
因此
可以確保在退出該方法之前總會調用 close 方法
這樣您就可以確信套接字被關閉並且您沒有洩漏資源
在此方法中不需要再有一個 catch 塊
在第一個示例中提供 catch 塊只是為了關閉套接字
現在這是通過 finally 關閉的
如果您確實提供了一個 catch 塊
則 finally 塊中的代碼在 catch 塊完成以後執行
finally 塊必須與 try 或 try/catch 塊配合使用
此外
不可能退出 try 塊而不執行其 finally 塊
如果 finally 塊存在
則它總會執行
(無論從那點看
這個陳述都是正確的
有一種方法可以退出 try 塊而不執行 finally 塊
如果代碼在 try 內部執行一條 System
exit(
); 語句
則應用程序終止而不會執行 finally 執行
另一方面
如果您在 try 塊執行期間撥掉電源
finally 也不會執行
)
try…catch…finally 塊
最好采用此結構處理異常
在catch中捕獲異常
在finally塊中清除不需要的資源
這樣程序結構將會更完善
健壯
例如:
try{
/**to do */
}
catch(Exception ex){
System
out
println(ex
getMessage());
}
finally{
clearUpAll()
}
激發異常 Java語言可以不在方法中直接捕獲
而用throw語句將異常拋給上層的調用者
Throw語句就是來明確地拋出一個異常
首先你必需得到一個Throwable的實例句柄
通過參數傳到catch中
或者采用new操作符來創建一個
格式
throw new WhcaException(e
getMessage);
程序會在throw語句後立即終止
它後面的語句都不執行
然後在包含它的所有try塊中從裡到外尋找含有與其匹配的catch
聲明異常類
當throw語句被用在方法說明中時
throw有用throws代替
關鍵字throws用來標明一個方法可能拋出的各種異常
對大多數Exception子類來說
Java編譯器會強迫你聲明在一個方法中拋出的異常的類型
如下
格式
type method_name(arg_list) throws WhcaException{
……
}
例如
public void execute(String str
int index) throws WhcaException{
try{
}
catch(Exception e){
throw new WhcaException(
JB: M:
+e
getMessage);
}
}
創建自己的異常類 當程序員為提供一些特定的功能用Java類時
往往需要保證類之間有良好的關系
而且類之間的接口易於理解和實現
這是定義一個新的異常類
建議創建自己的異常類
便於維護
管理
定義一個新的異常類
通常采用Exception作為異常類的超類
如
package mon;
public class WhcaException extends Exception{
public WhcaException(){
}
public WhcaException(String s){
super(s);
}
}
示例 下面是示例
TestServlet 調用TestDB和TestPsi
(附代碼)如果發生異常怎樣最快解決程序發生的異常錯誤
在整個項目的開發過程中
指定錯誤代碼表
並分類
如PSI類
數據庫異常類代碼
應用異常類代碼
XML異常
網絡通訊異常等等
采用自己的異常類
當遇到異常是
激發的異常攜帶錯誤類或異常方法的路徑
如
setFlag(
PSI
);
throw new WhcaException(
JB:TestA M:exe
+e
getMessage);
這裡
PSI
為錯誤代碼
JB:TestA M:exe
為異常鏈
e
getMessage為異常信息
例如
遇到錯誤信息列表為
JB:TestB M:exe
JB:TestA M:exe
java
sql
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19611.html