当一个 .java 文件被编译后,它会生成一个包含字节码的 .class 文件。JVM 会执行这个字节码。在此过程中,如果发生异常,源代码中出错的行数也会被提及。然而,字节码和源代码中的行号完全不同,并且在编译期间字节码也不会存储行号,因为我没有找到任何与之相关的助记符(而且存储行号只会增加代码大小)。那么有人能告诉我 JVM 如何获取异常抛出时源代码中的确切行数吗?
JVM规范提供了类文件(字节码)格式的参考。行号存储在属性LineNumberTable
中。您还可以尝试在某个.class
文件上运行以下Java反汇编器命令(JDK提供的javap
),以查看它们:
javap -l MyClass.class
-g
选项的信息。 - Abra