3

我的第一个问题是谁实际打印堆栈跟踪的打印件?是 JVM 还是其他实体?打印堆栈跟踪时幕后会发生什么?如果有应用程序提供了 UncaughtExceptionhandler,我正在专门寻找一个答案,告诉我 Uncaught 异常处理程序在打印堆栈跟踪中的作用。

4

3 回答 3

3

1.当异常发生时,它被抛出到JVM

2. JVM 然后打印 StackTrace。

3. StackTrace 包括方法名、名、文件名和行号。

4. fillInStackTrace()调用方法重新初始化新创建的 throwable 中的堆栈跟踪数据。将有助于在尝试访问 API 时屏蔽有关异常的信息。

于 2012-07-16T15:32:57.103 回答
1

您是在谈论未捕获的异常吗?如果您捕获到异常,您可以使用该Throwable.printStackTrace方法自己打印堆栈跟踪。如果您想知道它如何准确地打印堆栈跟踪,您可以查看源代码

对于未捕获的异常,堆栈跟踪由抛出异常的线程的“未捕获的异常处理程序”打印。如果线程没有自己的未捕获异常处理程序,则使用线程组的处理程序,该处理程序又委托给父线程组或“默认未捕获异常处理程序”。如果没有父处理程序也没有默认处理程序,则会发生这种情况:

否则,此方法确定Throwable参数是否为ThreadDeath. 如果是这样,没有什么特别的。否则,一条包含线程名称的消息(从线程的getName方法返回)和使用Throwable'printStackTrace方法的堆栈回溯将打印到标准错误流。

您可以使用Thread.setUncaughtExceptionHandler. 要设置默认的未捕获异常处理程序以捕获任何未捕获异常,请使用Thread.setDefaultUncaughtExceptionHandler

于 2012-07-16T15:49:38.600 回答
0

AThrowable及其所有子类(如 Exception 和 RuntimeException)是try-catchandthrow关键字所必需的,处理它们的是 JVM 的 Java 部分。

唯一不是纯 Java 的fillInStackTrace()方法是本机方法,这意味着该方法是由 Java 部分“外部”的 JVM 提供的。如果变量中有 Throwable,则可以检查堆栈跟踪的所有部分。

http://www.docjar.com/html/api/java/lang/Throwable.java.html

请注意,在“过去”中,异常是昂贵的对象(我相信这是因为堆栈跟踪是在构造异常时计算的,无论是否使用它),但这已经通过延迟堆栈进行了相当多的优化跟踪生成,直到实际需要为止。

于 2012-07-16T15:49:33.220 回答