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

时间:2012-12-27 23:01:36

标签: android dalvik java-bytecode-asm jvm-bytecode jasmin

为什么字节代码生成为

 .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/FileNotFoundException;
        }
 .end annotation

而不是.throws Ljava/io/FileNotFoundException

如果方法在java代码的头文件中声明throws FileNotFoundException

2 个答案:

答案 0 :(得分:4)

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

答案稍长:

检查异常的概念仅在编译时有效,而不是在运行时。 dalvik虚拟机不知道或关心您的方法可以抛出的异常。就其而言,一切都是未经检查的例外。这是java编译器强制在throws子句中声明已检查的异常。

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

听起来你正在使用类似dex2jar的东西将dex文件转换回一组类文件,然后使用jasmin。 dex2jar可能不会将dex文件中的Thoss注释重新映射回类文件中的Exception attribute,尽管我没有具体检查是否是这种情况。

答案 1 :(得分:1)

  

dalvik.annotation.Throws出现在方法

上      

A Throws annotation附加到声明抛出一个或多个的每个方法   异常类型。

位于this page的底部。