如何生成堆栈跟踪?
程序中没有单个方法“知道”它在堆栈中的位置。 它所知道的只是它自己的小工作,它就是这样做并且回归。 因此,当抛出exception并打印堆栈跟踪时,这是从哪里来的?
是否隐含地在JVM中的每个应用程序旁边运行一个单独的Thread来监视程序的状态? 或者JVM本身是否拥有此信息,并且exception以某种方式在抛出时从中提取数据?
如果是这种情况之一,是否可以使用一些调用来检索堆栈跟踪(来自监视器线程或JVM) 而不抛出exception?
每个线程都有自己的stack
。 每个方法调用都会创建一个堆栈帧。 如果在任何方法的代码中发生了错误,那么它将传播到调用方法。 这样JVM可以跟踪哪个方法生成错误以及调用层次结构是什么。
如果正确观察堆栈跟踪,您将看到顶部出错和底部出现层次结构的方法。
斯坦福大学教授在youtube上有一个很棒的讲座,了解它是如何工作的。 我建议看一下。
注意:这是理论。 如果您想知道API是如何工作的,@ Peter Lawrey的回答可能会对您有所帮助。
它来自运行代码的Thread类。
Thread.dumpStack();
要看到它,你可以:
StackTraceElement[] trace = Thread.currentThread().getStackTrace(); for (int i=0; i < trace.length; i++) System.out.println("\tat " + trace[i]);
您可以使用Thread.currentThread
了解方法所属的Thread。 使用此线程,您可以获取StackTrace,因为JVM中的每个线程都有一个堆栈。 此外, main
在main
线程中运行。
当你创建一个Throwable(而不是你扔它时)它会记录堆栈跟踪是一个与Throwable相关的低级/隐藏方式。 当您第一次从低级别信息创建StackTraceElement[]
对象时调用getStackTrace()。 由于通常不使用堆栈跟踪,因此不会懒惰。
- java – 在重写方法中检查’throws’的exception
- 不能使用try / catch块处理java未经检查的exception?
- 在struts xml中声明/处理哪些exception
- 如何在java中重启线程?
- weblogic中的类强制转换exception
- Java:我如何编写try-catch-repeat块?
- java.lang.Exception与滚动你自己的exception
- 线程“main”中的exceptionjava.lang.ArrayIndexOutOfBoundsException
- com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:为键’PRIMARY’复制条目”