为什么生成字节码为
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/FileNotFoundException;
}
.end annotation
而不是.throws Ljava/io/FileNotFoundException
如果一个方法throws FileNotFoundException
在java代码的头文件中声明?
为什么生成字节码为
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/FileNotFoundException;
}
.end annotation
而不是.throws Ljava/io/FileNotFoundException
如果一个方法throws FileNotFoundException
在java代码的头文件中声明?
简短的回答是 dex 格式中没有特定的“抛出”概念。当 java 类文件转换为 dex 格式时,会添加一个包含此信息的 Throws 注释。
稍微长一点的答案:
检查异常的概念只在编译时很重要,在运行时不重要。dalvik 虚拟机不知道也不关心你的方法会抛出什么异常。就它而言,一切都是未经检查的异常。是 java 编译器强制在 throws 子句中声明检查的异常。
因此,在 dex 文件中添加特定的“抛出”概念是没有意义的。相反,该信息是使用更通用的注释功能存储的。
听起来您正在使用 dex2jar 之类的东西将 dex 文件转换回一组类文件,然后在其上使用 jasmin。dex2jar 可能不会将 dex 文件中的 Throws 注释重新映射回类文件中的Exception 属性,尽管我没有专门检查是否是这种情况。
dalvik.annotation.Throws 出现在方法上
Throws 注释附加到每个声明为抛出一个或多个异常类型的方法。
在这个页面的底部。