程序中没有单个方法“知道”它在堆栈中的位置。它所知道的只是它自己的小工作,它就是这样做并且回归。因此,当抛出异常并打印堆栈跟踪时,它来自何处?
是否隐含地在JVM中的每个应用程序旁边运行一个单独的Thread来监视程序的状态?或者JVM本身是否拥有此信息,并且异常以某种方式从它中引出数据?
如果是这种情况之一,是否可以使用某些调用来检索堆栈跟踪(来自监视器线程或JVM)而不抛出异常?
答案 0 :(得分:5)
每个帖子都有自己的stack
。每个方法调用都会创建一个堆栈帧。如果在任何方法的代码中发生了错误,那么它将传播到调用方法。这样JVM可以跟踪哪个方法生成错误以及调用层次结构是什么。
如果正确观察堆栈跟踪,您将看到顶部出现错误而底部出现层次结构的方法。
斯坦福大学教授在youtube进行了一次精彩的讲座,了解它是如何运作的。我建议看一下。
注意:这是理论。如果您想知道API的工作原理,@ Peter Lawrey的回答可能对您有帮助。
答案 1 :(得分:4)
它来自正在运行代码的Thread类。
Thread.dumpStack();
要看到它,你可以:
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for (int i=0; i < trace.length; i++)
System.out.println("\tat " + trace[i]);
答案 2 :(得分:3)
您可以使用Thread.currentThread
了解方法所属的线程。使用此线程,您可以获取StackTrace,因为JVM中的每个线程都有一个堆栈。此外,main
程序在main
主题中运行。
答案 3 :(得分:3)
当你创建一个Throwable(而不是你抛出它时)它会记录堆栈跟踪是一个与Throwable相关的低级/隐藏方式。当您第一次从低级别信息创建StackTraceElement[]
对象时调用getStackTrace()。由于通常不使用堆栈跟踪,所以这不是懒惰的。