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

Java JVM如何在运行时知道行号?,java,line-numbers,jvm-bytecode,Java,Line Numbers,Jvm Bytecode,编译.java文件时,它会生成一个包含字节码的.class文件。JVM接受该字节码并执行它。在此步骤中,如果抛出异常,还将提到源代码中发生此错误的行。但是字节码和源代码中的行号将完全不同,并且字节码在编译期间也不会存储行号,因为我没有找到任何与之相关的助记符(而且存储行号只会增加代码的大小)。有人能告诉我JVM是如何在抛出异常的源代码中获得准确的行号的。JVM规范提供了类文件(字节码)格式的参考。行号存储在属性中。您还可以尝试在某个.class文件上运行以下Java反汇编程序命令(javap由J

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

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

javap -l MyClass.class

编译器生成调试信息-因此您的语句“字节码也不存储行号”不正确。它不保留原始的行数和内容,但信息是存在的。阅读javadoc for@Abra中的
-g
选项,我只是浏览了一下。。我想我现在问这个问题还为时过早。谢谢:)