1

throwステートメントへの明示的な呼び出しは、throw命令を使用してバイトコード レベルで表されます。

たとえば、以下のコード スニペット:

private static SQLException thrower() throws SQLException
{
    throw new SQLException();
}

次のバイトコードに変換されます。

   private static java.sql.SQLException thrower()   throws java.sql.SQLException;
   Signature: ()Ljava/sql/SQLException;
   Code:
   0:   new #29; //class java/sql/SQLException
   3:   dup
   4:   invokespecial   #31; //Method java/sql/SQLException."<init>":()V
   7:   athrow

私の質問は、バイトコードを分析するだけで、スローされた例外のタイプをどのように知ることができるでしょうか?

Obs.:ソース コードでthrowステートメントを呼び出すときに、常に新しい例外の種類をインスタンス化するとは限らないことに注意してください。したがって、新しい命令の引数の型を調べることは解決策ではありません。

4

3 に答える 3

2

特定の命令が複数の種類の例外をスローする可能性があるため、これは不可能です。

コードを検討する

throw foo ? new ClassCastException() : new IOException();

より複雑な状況では、実行時に決定された型で何かをスローしたり、実行時に構築されたクラスから作成されたりすることさえあります。

于 2013-09-12T19:39:08.183 に答える
0

この質問はあまりにも一般的です。したがって、ここに一般的な答えがあります。

オペコードによって消費される値を配置した命令または命令を特定しathrow、その値が作成されるポイントまでデータ フローをたどる必要があります。

于 2013-09-12T17:15:10.587 に答える