当我们说e.printStackTrace();
时会发生什么?此处e
是Exception
。它是否会停止正常执行并实际从线程堆栈中删除激活记录以提供异常的堆栈跟踪?在应用程序中使用它是一个好主意吗?
答案 0 :(得分:4)
它只是将异常对象已经拥有的堆栈跟踪打印到STDERR。无副作用。
答案 1 :(得分:3)
e.printStackTrace();
此方法在错误输出流上打印此Throwable对象的堆栈跟踪,该字段是System.err字段的值
答案 2 :(得分:3)
没有什么特别聪明的事情发生。 Exception
对象包含StackTraceElements的列表,只需在调用上述内容时将它们转储到stderr。
答案 3 :(得分:2)
是否会停止正常执行
没有
并实际从线程堆栈中删除激活记录以给出异常的堆栈跟踪?
没有。
信息已经已经被捕获。这发生在Throwable
的构造函数中;即当你new
例外时,而不是throw
时。 Throwable
构造函数调用fillInStackTrace()
本机方法,该方法获取堆栈的快照,并将生成的StackTraceElement[]
存储在稍后在打印堆栈跟踪时使用的私有变量中。
(对于记录,这是在Throwable
的构造函数的javadoc中指定的。
在应用程序中使用它是否是一个好主意?
它相当昂贵并且可以产生大量输出。但是,如果您需要堆栈跟踪用于诊断目的......请执行此操作。
答案 4 :(得分:0)
如前所述,没有任何副作用,在生产代码中使用它本身不会引入任何问题。我不会真的建议(在生产代码中),但是,仅仅因为在大多数应用程序中使用记录器来更好地控制记录的内容以及记录的位置会更好。
答案 5 :(得分:0)
堆栈跟踪通过fillInStackTrace
加载,这是在Throwable的构造函数中调用的本机方法。 (简洁提示:这种方法可以作为“信号异常”的NOP重载,不需要相当昂贵的调用来获取堆栈)。
当“被捕获”时, Throwable对象已经存在堆栈跟踪的“冻结”。
根据java.lang.Throwable的代码显示fillInStackTrace
被称为构造函数的第一个动作。 StackTraceElement
数组用于序列化支持(也可以手动设置)和延迟缓存。
即使fillInStackTrace
捕获跟踪它不加载到Java对象中 - 我想这允许实现保持“便宜” - 直到需要访问它作为StackTraceElement
对象的序列(例如,对于printStackTrace
,它是在Java代码中完成的)。 Throwable的代码比我能解释的更好: - )
快乐的编码。