1

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 类型一次。

4

1 回答 1

4

Java 7 (Platform) 支持动态调度,支持在 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)但看起来上面的代码只是使用最不通用的常见类型。

于 2013-06-10T22:52:18.263 回答