Java 如何生成堆栈跟踪?

Java 如何生成堆栈跟踪?,java,exception,stack-trace,Java,Exception,Stack Trace,程序中没有一个方法“知道”它在堆栈上的位置。它所知道的只是它自己的小工作,它完成了,然后返回。所以,当抛出异常并打印堆栈跟踪时,这是从哪里来的 JVM中监视程序状态的每个应用程序旁边是否隐含着一个单独的线程?或者JVM本身是否持有这些信息,异常在抛出时以某种方式从中提取数据 如果是这两种情况之一,是否可以使用一些调用来检索堆栈跟踪(从监视器线程或JVM),而不引发异常?每个线程都有自己的堆栈。每个方法调用都会创建一个堆栈帧。若任何方法的代码中发生错误,那个么该错误将传播到调用方方法。通过这种方式

程序中没有一个方法“知道”它在堆栈上的位置。它所知道的只是它自己的小工作,它完成了,然后返回。所以,当抛出异常并打印堆栈跟踪时,这是从哪里来的

JVM中监视程序状态的每个应用程序旁边是否隐含着一个单独的线程?或者JVM本身是否持有这些信息,异常在抛出时以某种方式从中提取数据


如果是这两种情况之一,是否可以使用一些调用来检索堆栈跟踪(从监视器线程或JVM),而不引发异常?

每个线程都有自己的
堆栈。每个方法调用都会创建一个堆栈帧。若任何方法的代码中发生错误,那个么该错误将传播到调用方方法。通过这种方式,JVM可以跟踪哪个方法生成错误以及调用层次结构是什么

如果您正确地观察堆栈跟踪,您将看到顶部出现错误的方法和底部的层次结构

斯坦福大学的一位教授做了一个很好的讲座,来了解它是如何工作的。我建议看一看


注:这是理论。如果您想知道API是如何工作的,@Peter Lawrey answer可能会对您有所帮助。

它来自正在代码中运行的线程类

Thread.dumpStack();
要查看它,您可以:

    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
    for (int i=0; i < trace.length; i++)
        System.out.println("\tat " + trace[i]);
stackTraceeElement[]trace=Thread.currentThread().getStackTrace();
对于(int i=0;i
通过使用
Thread.currentThread
可以知道方法所属的线程。使用这个线程,您可以获得StackTrace,因为JVM中的每个线程都有一个堆栈。另外,
main
程序在
main
线程中运行。

当您创建一个可丢弃文件时(而不是当您抛出文件时),它记录堆栈跟踪是与可丢弃文件相关联的低级/隐藏方式。当您第一次调用getStackTrace()时,它会根据低级信息创建
StackTraceeElement[]
对象。由于堆栈跟踪经常不被使用,所以它不会延迟执行此操作。

是的,我对该理论非常感兴趣。:)这就是为什么我问这个问题,不是为了任何具体的实际目的。好吧,那么我的回答可能会给出一些线索,视频系列可能会填补空白。