Dalvik 字节码中的“抛出”和“异常注释”

mon*_*ica 5 android dalvik jasmin java-bytecode-asm jvm-bytecode

为什么字节码生成为

 .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/FileNotFoundException;
        }
 .end annotation
Run Code Online (Sandbox Code Playgroud)

而不是.throws Ljava/io/FileNotFoundException

throws FileNotFoundException如果一个方法在java代码的标头中声明?

Jes*_*eke 5

简短的回答是,dex 格式中没有特定的“抛出”概念。当 java 类文件转换为 dex 格式时,会添加包含此信息的 Throws 注释。

稍微长一点的答案:

检查异常的概念仅在编译时重要,而不在运行时重要。dalvik 虚拟机不知道也不关心你的方法会抛出什么异常。就其而言,一切都是未经检查的异常。java 编译器强制在 throws 子句中声明受检查的异常。

因此,向 dex 文件添加特定的“抛出”概念是没有意义的。相反,该信息是使用更通用的注释功能来存储的。

听起来你正在使用像 dex2jar 这样的东西将 dex 文件转换回一组类文件,然后在其上使用 jasmin 。dex2jar 很可能不会将 Throws 注释从 dex 文件重新映射回类文件中的Exception 属性,尽管我没有具体检查情况是否如此。