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 (プラットフォーム) は、 JythonJRubyなどの JVM で実行される他の言語の動的ディスパッチをサポートしています。ただし、上記のコードは 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 に答える