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

How JVM knows line numbers during runtime?

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

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

javap -l MyClass.class