问题描述
当一个 .java 文件被编译时,它会产生一个包含字节码的 .class 文件。 JVM 获取该字节码并执行它。这一步的字节,如果抛出异常,还会在源代码中提到这个错误发生在哪一行。但是字节码和源代码中的行号将完全不同,并且字节码在编译期间也不存储行号,因为我没有找到任何与之相关的助记符(并且存储行号只会增加代码大小)。那么有人能告诉我 JVM 如何在抛出异常的源代码中获取确切的行号。
解决方法
JVM 规范为类文件(字节码)的格式提供了参考。行号存储在属性 LineNumberTable
中。您还可以尝试在某个 javap
文件上运行以下 Java 反汇编命令(.class
由 JDK 提供)以查看它们:
javap -l MyClass.class