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

Sou*_*a B 3 java line-numbers jvm-bytecode

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

man*_*uti 6

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

javap -l MyClass.class
Run Code Online (Sandbox Code Playgroud)