程序编译时stacktrace是怎么打印出来的?

How is the stacktrace printed when the program is compiled?

这是一个非常简单的问题:

当你编译一个 java 程序时,它被转换成字节码,因此,.java 或 .class 文件的每一行号都被遗漏了(我认为所以,可能我错了..)。那么,当您打印堆栈跟踪时,它如何设法获取调用堆栈中的所有 class 名称和行号?我想我可能在这里遗漏了一些东西,但我找不到与此相关的任何东西。

When you compile a java program, it is converted to byte code

正确。

so therefore, every line number of the .java or .class file is missed (I think so, probably I am wrong..).

你错了。行号信息嵌入到 .class 文件中,除非您以某些方式使用 -g 编译器选项。

如果存在行号,则 java 编译器创建的字节码会将 debug 标志设置为 true。这可以使用 java -g

来实现

来自 Oracle 的 javac 文档:

  • -g
    • Generate all debugging information, including local variables. By default, only line number and source file information is generated.
  • -g:none
    • Do not generate any debugging information.
  • -g:{keyword list} - Generate only some kinds of debugging information, specified by a comma separated list of keywords. Valid keywords are:
    • source
      • Source file debugging information
    • lines
      • Line number debugging information
    • vars
      • Local variable debugging information