5

为什么生成字节码为

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

而不是.throws Ljava/io/FileNotFoundException

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

4

2 回答 2

5

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

稍微长一点的答案:

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

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

听起来您正在使用 dex2jar 之类的东西将 dex 文件转换回一组类文件,然后在其上使用 jasmin。dex2jar 可能不会将 dex 文件中的 Throws 注释重新映射回类文件中的Exception 属性,尽管我没有专门检查是否是这种情况。

于 2012-12-28T00:02:34.440 回答
1

dalvik.annotation.Throws 出现在方法上

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

这个页面的底部。

于 2012-12-27T23:20:38.063 回答