熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java 中的異常處理從概念到實例

2013-11-15 11:46:51  來源: JSP教程 

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