为什么字节码生成为
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/FileNotFoundException;
}
.end annotation
而不是 .throws Ljava/io/FileNotFoundException
如果方法在 java 代码的 header 中声明throws FileNotFoundException
?
最佳答案
简短的回答是,dex 格式中没有特定的“throws”概念。当 java 类文件转换为 dex 格式时,会添加包含此信息的 Throws 注释。
稍微长一点的答案:
检查异常的概念只在编译时起作用,在运行时无关紧要。 dalvik 虚拟机不知道也不关心你的方法会抛出什么异常。就其而言,一切都是未经检查的异常。 Java 编译器强制在您的 throws 子句中声明已检查的异常。
因此,在 dex 文件中添加特定的“throws”概念是没有意义的。相反,该信息是使用更通用的注释功能存储的。
听起来您正在使用类似 dex2jar 的东西将 dex 文件转换回一组类文件,然后在其上使用 jasmin。 dex2jar 可能不会将 dex 文件中的 Throws 注释重新映射回 Exception attribute在类文件中,虽然我没有具体检查是否是这种情况。
关于android - Dalvik 字节码中的 "throws"和 "annotation for exception",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062434/