JVM 如何在运行时知道行号?

问题描述

一个 .java 文件被编译时,它会产生一个包含字节码的 .class 文件。 JVM 获取该字节码并执行它。这一步的字节,如果抛出异常,还会在源代码中提到这个错误发生在哪一行。但是字节码和源代码中的行号将完全不同,并且字节码在编译期间也不存储行号,因为我没有找到任何与之相关的助记符(并且存储行号只会增加代码大小)。那么有人能告诉我 JVM 如何在抛出异常的源代码获取确切的行号。

解决方法

JVM 规范为类文件(字节码)的格式提供了参考。行号存储在属性 LineNumberTable 中。您还可以尝试在某个 javap 文件上运行以下 Java 反汇编命令(.class 由 JDK 提供)以查看它们:

javap -l MyClass.class