在某個在線論壇上,有人提到Java的靜態異常檢查功能並不好,並且會導致可伸縮性和版本控制問題。什麼是靜態異常檢查和動態異常檢查?
我想在類函數中拋出一個新的異常,打破客戶端代碼可以歸因於版本問題。但我不確定。
什麼是靜態異常檢查的可擴展性問題?
什麼是動態異常檢查?
在某個在線論壇上,有人提到Java的靜態異常檢查功能並不好,並且會導致可伸縮性和版本控制問題。什麼是靜態異常檢查和動態異常檢查?
我想在類函數中拋出一個新的異常,打破客戶端代碼可以歸因於版本問題。但我不確定。
什麼是靜態異常檢查的可擴展性問題?
什麼是動態異常檢查?
當程序員無法拋出適合該方法的異常時,檢查Java中的異常會導致可伸縮性問題。 (請參閱有效Java,條目43:拋出適用於抽象的異常)。
懶惰的程序員傾向於在其方法的throws
子句中添加例外情況,而不考慮它們是否合適。因此,隨着您在應用程序體系結構中越來越高,方法會聚集越來越多的異常。如果人們不小心,頂級方法會拋出10個或更多的異常。例如,在設計用於加密數據的方法中,可能拋出許多低級別的例外(例如,IOException
,NoSuchAlgorithmException
,KeyNotFoundException
...)。沒有必要將這些公開給API用戶。相反,可能會拋出一個異常,並將異常細節存儲在cause
字段中。
我相信「動態異常檢查」可能是指捕捉Throwable
或Exception
(根類之一)和動態決定是否處理異常,一些外部的刺激。例如:
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,並允許他們選擇他們希望捕獲的異常類。
我想動態異常檢查只是在運行時觸發異常的另一個名稱。
雖然我相信靜態異常檢查,但靜態異常檢查的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();
....
}
正如你看到的,在實踐中,我們IParser
是IStringParser
,而不是通用IParser
。
雖然在這種特殊情況下它可能是可以容忍的,但當我們想要提供IParser
作爲函數f
的參數之一時,它會變得複雜。說,爲了能夠解析URL識別的服務器的響應,我們不能僅僅饋送ServerResponseParser
對象和url —,我們需要找到一種將getServerResponse
方法提供給f
的方法。
你的意思是選中和未選中異常處理? – 2013-02-24 07:09:22
據推測http://en.wikipedia.org/wiki/Exception_handling#Dynamic_checking_of_exceptions – 2013-02-24 07:10:28
@ Quoi:我不知道,因爲我不知道如果動態異常檢查與未經檢查的異常處理相同。 – 2013-02-24 07:36:29