Java7的多异常catch子句是否使用duck typing?

时间:2013-06-10 22:42:28

标签: java exception try-catch

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#multiple

  

处理多个异常类型的catch块不会在编译器生成的字节码中产生重复;字节码没有异常处理程序的复制。

如果代码如下所示:

class FooExcn extends Exception { ... }
class BarExcn extends Exception { ... }
class Fred {
  void log(FooExcn f) { /* calls FooExcn-specific methods */ }
  void log(BarExcn b) { /* calls BarExcn-specific methods */ }
  void test() {
    try { }
    catch (FooExcn | BarExcn ex) {
      log(ex);
      /* do other stuff */
    }
  }
}

看起来catch块的字节码取决于异常的类型,因此必须重复一次,对于捕获的每个excn类型。

1 个答案:

答案 0 :(得分:4)

Java 7(平台)支持dynamic dispatch,适用于在JVM上运行的其他语言,如JythonJRuby。但是,上面的代码不适用于Java 7

test.java:9: error: no suitable method found for log(Exception)
      log(ex);
      ^
    method Fred.log(BarExcn) is not applicable
      (actual argument Exception cannot be converted to BarExcn by method invocation conversion)
    method Fred.log(FooExcn) is not applicable
      (actual argument Exception cannot be converted to FooExcn by method invocation conversion)
1 error

所以是的 - 鸭子打字可以在JVM上运行(甚至在1.7之前,因为他们使用了不同的技术,然后invokedynamic),但看起来上面的代码只是使用最不常见的常见类型。