2013-02-24 135 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的方法。