在程序中,没有任何一种方法“知道”它在堆栈上的位置。它只知道自己的小任务,并执行该任务后返回。因此,当抛出异常并打印堆栈跟踪时,这是从哪里来的呢?
是否隐式存在一个与JVM中每个应用程序并行运行的单独线程,监视程序状态?还是JVM本身保存此信息,异常在抛出时从中提取数据?
如果是这两种情况之一,是否可能使用某些调用检索堆栈跟踪(从监视器线程或JVM中),而不需要抛出异常?
在程序中,没有任何一种方法“知道”它在堆栈上的位置。它只知道自己的小任务,并执行该任务后返回。因此,当抛出异常并打印堆栈跟踪时,这是从哪里来的呢?
是否隐式存在一个与JVM中每个应用程序并行运行的单独线程,监视程序状态?还是JVM本身保存此信息,异常在抛出时从中提取数据?
如果是这两种情况之一,是否可能使用某些调用检索堆栈跟踪(从监视器线程或JVM中),而不需要抛出异常?
这源于在代码中运行的Thread类。
Thread.dumpStack();
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for (int i=0; i < trace.length; i++)
System.out.println("\tat " + trace[i]);
你可以使用Thread.currentThread
方法来了解一个方法所属的线程。使用这个线程,你可以获取堆栈跟踪信息,因为JVM中每个线程都有一个堆栈。而且,main
程序运行在main
线程中。
当你创建一个Throwable对象(不是当你抛出它时),它会以低级/隐藏的方式记录堆栈跟踪。当你第一次调用getStackTrace()方法时,它会从这些低级信息中创建StackTraceElement[]数组对象。由于堆栈跟踪经常不被使用,因此它不会立即创建。