11

Java 7コンパイラはマルチキャッチブロックをどのように処理しますか?単純な実装は、複数のキャッチブロックが存在するかのようにバイトコードを生成することです。ただし、これは当てはまらないことを複数のソースから収集しました。複数の例外タイプを処理するcatchブロックは、コンパイル中に重複するバイトコードを提供しません。

それで、それはどのように機能しますか?マルチキャッチブロックについてJVMに通知する新しいバイトコード命令はありますか?

4

2 に答える 2

15

Java仮想マシン仕様に基づいて、例外は次のようにコンパイルされます(要約)。

  • コードを正常に実行してみてください
  • 各catchブロックは、個別のメソッドであるかのようにコンパイルされます
  • 実行フローを正しいキャッチブロックにリダイレクトするための例外テーブルがあります

multi catch句を使用する場合、catchブロックは同じです(1回だけ表示されます)が、例外テーブルには、同じfrom、to、およびtarget値を持つもう1つのエントリが含まれます。

たとえば、次のコードは次のとおりです。

public static void main(String args[]) throws InterruptedException {
    try {
        System.out.println("why not?");
    } catch (IllegalArgumentException e) {
        System.out.println("here");
    } catch (IllegalStateException | ArithmeticException e) {
        System.out.println("there");
    }
}

次の例外テーブルを(私のマシンで)生成します。

   from    to  target type
       0     8    11   Class java/lang/IllegalArgumentException
       0     8    23   Class java/lang/IllegalStateException
       0     8    23   Class java/lang/ArithmeticException
于 2012-04-24T16:03:02.777 に答える
1

例外テーブルは、すべての例外クラス(例外テーブルのエントリ)を反復処理し、スローされた例外がそれを実装しているかどうかをチェックして、バイトコードのどこにジャンプするかを決定する一種のスイッチのように機能します。

http://www.artima.com/underthehood/exceptions.html

これによると、例外テーブルに新しいエントリを作成するだけで、2つのエントリが同じPCオフセットを指すことができない理由がわかりません。

(免責事項:私はバイトコードの専門家ではなく、何年も触れていないので、何かを見逃す可能性があります)

于 2012-04-24T16:02:18.417 に答える