当编译.java文件时,它会生成一个包含字节码的.class文件。JVM接受字节码并执行它。在此步骤中,如果抛出异常,还会提到源代码中发生此错误的行。但是字节码和源代码中的行号将完全不同,字节码在编译期间也不存储行号,因为我没有发现任何与之相关的助记符(而且存储行号只会增加代码大小)。所以有人能告诉我JVM是如何得到抛出异常的源代码中的确切行号的吗?
JVM规范提供了类文件(字节码)格式的参考。行号存储在属性LineNumberTable
中。您也可以尝试在某个.class
文件上运行以下Java反汇编器命令(JDK提供的javap
)来查看它们:
javap -l MyClass.class