熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java程序異常處理方法

2013-11-23 19:08:46  來源: Java核心技術 
    對於java異常處理你是否都掌握了呢如果是你是否能在下面這段代碼中迅速找出異常處理的六個問題嗎?
   
    OutputStreamWriter out = …
   
    javasqlConnection conn = …
   
    try { // ⑸
   
      Statement stat = conncreateStatement()
   
      ResultSet rs = statexecuteQuery(
   
       select uid name from user
   
      while (rsnext())
   
      {
   
       outprintln(ID: + rsgetString(uid) // ⑹
   
        姓名 + rsgetString(name))
   
      }
   
      connclose() // ⑶
   
      outclose()
   
    }
   
    catch(Exception ex) // ⑵
   
    {
   
      exprintStackTrace() //⑴
   
    作為一個Java程序員你至少應該能夠找出兩個問題但是如果你不能找出全部六個問題請繼續閱讀本文本文討論的不是Java異常處理的一般性原則因為這些原則已經被大多數人熟知我們要做的是分析各種可稱為反例(antipattern)的違背優秀編碼規范的常見壞習慣幫助讀者熟悉這些典型的反面例子從而能夠在實際工作中敏銳地察覺和避免這些問題

   
    反例之一丟棄異常
   
    代碼
   
    這段代碼捕獲了異常卻不作任何處理可以算得上Java編程中的殺手從問題出現的頻繁程度和禍害程度來看它也許可以和C/C++程序的一個惡名遠播的問題相提並論??不檢查緩沖區是否已滿如果你看到了這種丟棄(而不是拋出)異常的情況可以百分之九十九地肯定代碼存在問題這段代碼的錯誤在於異常(幾乎)總是意味著某些事情不對勁了或者說至少發生了某些不尋常的事情我們不應該對程序發出的求救信號保持沉默和無動於衷調用一下printStackTrace算不上處理異常不錯調用printStackTrace對調試程序有幫助但程序調試階段結束之後printStackTrace就不應再在異常處理模塊中擔負主要責任了丟棄異常的情形非常普遍打開JDK的ThreadDeath類的文檔可以看到下面這段說明特別地雖然出現ThreadDeath是一種正常的情形但ThreadDeath類是Error而不是Exception的子類因為許多應用會捕獲所有的Exception然後丟棄它不再理睬這段話的意思是雖然ThreadDeath代表的是一種普通的問題但鑒於許多應用會試圖捕獲所有異常然後不予以適當的處理所以JDK把ThreadDeath定義成了Error的子類因為Error類代表的是一般的應用不應該去捕獲的嚴重問題可見丟棄異常這一壞習慣是如此常見它甚至已經影響到了Java本身的設計
   
    那麼應該怎樣改正呢?主要有四個選擇
   
    處理異常針對該異常采取一些行動例如修正問題提醒某個人或進行其他一些處理要根據具體的情形確定應該采取的動作再次說明調用printStackTrace算不上已經處理好了異常
   
    重新拋出異常處理異常的代碼在分析異常之後認為自己不能處理它重新拋出異常也不失為一種選擇
   
    把該異常轉換成另一種異常大多數情況下這是指把一個低級的異常轉換成應用級的異常
   
    不要捕獲異常
   
    結論一既然捕獲了異常就要對它進行適當的處理不要捕獲異常之後又把它丟棄不予理睬
   
    反例之二不指定具體的異常
   
    代碼
   
    許多時候人們會被這樣一種美妙的想法吸引用一個catch語句捕獲所有的異常最常見的情形就是使用catch(Exception ex)語句但實際上在絕大多數情況下這種做法不值得提倡為什麼呢?要理解其原因我們必須回顧一下catch語句的用途catch語句表示我們預期會出現某種異常而且希望能夠處理該異常異常類的作用就是告訴Java編譯器我們想要處理的是哪一種異常由於絕大多數異常都直接或間接從javalangException派生catch(Exception ex)就相當於說我們想要處理幾乎所有的異常再來看看前面的代碼例子我們真正想要捕獲的異常是什麼呢?最明顯的一個是SQLException這是JDBC操作中常見的異常
   
    另一個可能的異常是IOException因為它要操作OutputStreamWriter顯然在同一個catch塊中處理這兩種截然不同的異常是不合適的如果用兩個catch塊分別捕獲SQLException和IOException就要好多了這就是說catch語句應當盡量指定具體的異常類型而不應該指定涵蓋范圍太廣的Exception類另一方面除了這兩個特定的異常還有其他許多異常也可能出現例如如果由於某種原因executeQuery返回了null該怎麼辦?答案是讓它們繼續拋出即不必捕獲也不必處理實際上我們不能也不應該去捕獲可能出現的所有異常程序的其他地方還有捕獲異常的機會?直至最後由JVM處理


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26354.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.