2013-02-24 402 views
4

在某個在線論壇上,有人提到Java的靜態異常檢查功能並不好,並且會導致可伸縮性和版本控制問題。什麼是靜態異常檢查和動態異常檢查?

我想在類函數中拋出一個新的異常,打破客戶端代碼可以歸因於版本問題。但我不確定。

  • 什麼是靜態異常檢查的可擴展性問題?

  • 什麼是動態異常檢查?

+0

你的意思是選中和未選中異常處理? – 2013-02-24 07:09:22

+0

據推測http://en.wikipedia.org/wiki/Exception_handling#Dynamic_checking_of_exceptions – 2013-02-24 07:10:28

+0

@ Quoi:我不知道,因爲我不知道如果動態異常檢查與未經檢查的異常處理相同。 – 2013-02-24 07:36:29

回答

3

當程序員無法拋出適合該方法的異常時,檢查Java中的異常會導致可伸縮性問題。 (請參閱有效Java,條目43:拋出適用於抽象的異常)。

懶惰的程序員傾向於在其方法的throws子句中添加例外情況,而不考慮它們是否合適。因此,隨着您在應用程序體系結構中越來越高,方法會聚集越來越多的異常。如果人們不小心,頂級方法會拋出10個或更多的異常。例如,在設計用於加密數據的方法中,可能拋出許多低級別的例外(例如,IOException,NoSuchAlgorithmException,KeyNotFoundException ...)。沒有必要將這些公開給API用戶。相反,可能會拋出一個異常,並將異常細節存儲在cause字段中。


我相信「動態異常檢查」可能是指捕捉ThrowableException(根類之一)和動態決定是否處理異常,一些外部的刺激。例如:

List<Class<?>> exceptionTypes = new ArrayList<>(); 
exceptionTypes.add(IllegalArgumentException.class); 
exceptionTypes.add(IOException.class); 

try { 
    // do something 
} catch (Exception e) { 
    if (exceptionTypes.contains(e.getClass())) { 
    e.printStackTrace(); 
    } 
} 

注意:上面的例子只是一個例子。但想象一下代表用戶執行代碼的IDE,並允許他們選擇他們希望捕獲的異常類。

0

我想動態異常檢查只是在運行時觸發異常的另一個名稱。

雖然我相信靜態異常檢查,但靜態異常檢查的Java方法確實存在與接口實現有關的問題。

說,我們有IParser。其方法parse()可能拋出什麼適當的例外?可能SyntaxErrorException。現在,我們希望有一個ServerResponseParserFromURL以這樣的方式被使用:

class ServerResponseParserFromURL implements IParser { .... }; 
.... 
try { 
    IParser parser = new ServerResponseParser(new URL("http://example.com/test.htm")); 
    parser.parse(); 
    .... 
} 

這是問題—的IParser的實施可能會閃光,比如,NoRouteToHostException。因此,我們不能用漂亮,簡潔的形式,需要退回到長型:

class ServerResponseParser implements IParser { .... }; 
.... 
try { 
    String response = getServerResponse(new URL("http://example.com/test.htm")); 
    IParser parser = new ServerResponseParser(response); 
    parser.parse(); 
    .... 
} 

正如你看到的,在實踐中,我們IParserIStringParser,而不是通用IParser

雖然在這種特殊情況下它可能是可以容忍的,但當我們想要提供IParser作爲函數f的參數之一時,它會變得複雜。說,爲了能夠解析URL識別的服務器的響應,我們不能僅僅饋​​送ServerResponseParser對象和url —,我們需要找到一種將getServerResponse方法提供給f的方法。