当前位置: 首页 > 知识库问答 >
问题:

如何知道字节码级别抛出的异常类型?

易嘉胜
2023-03-14
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

我的问题是:我如何只通过分析字节码就知道被抛出的异常的类型?

值得一提的是,当我们调用源代码中的throw语句时,并不总是会实例化一个新的异常类型。因此,查看新指令的参数类型并不是一个解决方案。

共有1个答案

曹嘉许
2023-03-14

这是不可能的,因为给定的指令可能引发一种以上类型的异常。

考虑代码

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

在更复杂的情况下,您可能会抛出具有在运行时确定的类型的东西,或者甚至是从在运行时构造的类创建的东西。

 类似资料:
  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文

  • 我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。 JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。

  • 我是jUnit和mockito的新手。对于虚空的嘲弄是如何发挥作用的,我完全感到困惑。在这里,如果名称是“hello”,则函数抛出一个异常。但当我测试它时,它并没有抛出异常... 测试 }