Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止日志中的堆栈跟踪截断_Java_Exception_Stack Trace - Fatal编程技术网

Java 如何停止日志中的堆栈跟踪截断

Java 如何停止日志中的堆栈跟踪截断,java,exception,stack-trace,Java,Exception,Stack Trace,很多时候,在Java日志中,我会得到如下结果: Caused by: java.sql.BatchUpdateException: failed batch at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102) at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514) at

很多时候,在Java日志中,我会得到如下结果:

Caused by: java.sql.BatchUpdateException: failed batch
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 113 more
是否有人知道如何显示完整的stacktrace(即显示其他113行)



for Throwable对正在发生的事情有一个非常详细的解释。

当您看到“…113 more”时,这意味着“caused by”异常的剩余行与父异常上该点的剩余行相同

例如,您将拥有

com.something.XyzException
  at ...
  at ...
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
  at ... <the other 113 lines are here>...
Caused by: <the above>.
com.something.XyzException
在
在
位于org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
在
原因:。
两个堆栈跟踪在AbstractBatcher.executeBatch第242行“相遇”,然后从那时起,向上调用跟踪与包装异常相同。

Apache提供了一个很好的util方法,它“颠倒”打印嵌套的堆栈跟踪。结果更加直观


如果您在printStackTrace()方法的原始输出旁边看到结果,那么“113多行”的位置就很清楚了。

在我刚才描述的一篇博文中:设置
hibernate.jdbc.factory\u class=org.hibernate.jdbc.NonBatchingBatcherFactory
以禁用hibernate中的批处理。 通常可以使用
BatchUpdateException.getNextException
来获取失败的原因,但在某些情况下,这可能返回
null
。然后,完全禁用批处理非常有用。

我喜欢下面的示例:

基本上在源代码中,
main
调用
函数a
哪个调用
函数b
哪个调用。。。它调用函数e。
函数e
抛出一个
低级别异常
,这导致函数c捕获
低级别异常
并抛出一个
中级别异常
(将
LowLevelException
实例包装在
MidLevelException
实例中。
Exception
类有一个构造函数,可以接收不同的异常,并将其包装)。这会导致函数a捕获
中间级别异常
并抛出一个
高级异常
,该异常现在封装了前两个
异常
实例

正如在其他答案中所指出的,堆栈跟踪并没有真正被截断,您看到的是完整的堆栈跟踪。在我的示例中,
…3个以上的
,因为它是多余的,否则它将是多余的。如果您想成为多余的并浪费输出行,
。3个以上的
可以用

at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)

但是没有必要输出这三行,因为它们已经被暗示了。

增加
-XX:MaxJavaStackTraceDepth
JVM选项。

我发现这对了解整个情况很有用。获取异常的完整堆栈跟踪和原因(通常显示主异常中的重复行,但可能会有所帮助)


什么?原因与包装异常相同?我没有得到它…couse应该显示问题所在的行,在截断stacktrace时没有显示什么。我有这个问题,希望理解这个答案,如果有人可以重新编写它…谢谢!顺便说一句,这个答案似乎没有显示如何打印e full stacktrace。@TomBrito您看到的是完整的stacktrace——您有两个异常,一个在另一个内部。如果内部(包装)异常的堆栈跟踪是一个B C D e F G,而外部异常的堆栈跟踪是一个B C Z,那么您将看到带有堆栈跟踪Z C B A的OuterException,这是由“InnerException with the stack trace”引起的“G F E D C…‘然后再加两个’"。另外两个是A和B,来自外部堆栈跟踪,它们是为了简洁而指定的。这个答案是不正确的。我绝对遇到过剩余行不相同的情况。在这种情况下,解决方案是增加堆栈跟踪的最大深度,正如Nikita Koksharov在下面指出的,通过使用-XX:MaxJavaStackTraceDepth VM选项。这不会回答问题。这可能会解决他在现实生活中的情况,因此将其添加为对他的问题的评论可能比发布答案更有帮助。为什么这会被否决?这正是答案。设置为-1可获得无限深度。
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
        ... catch( Exception e) ...

        ... catch( NoClassDefFoundError e)
        {

                for(StackTraceElement ste: e.getStackTrace())
                {
                    System.out.println(ste);
                }

                if( e.getCause()!=null )
                {
                    for(StackTraceElement ste: e.getCause().getStackTrace())
                    {
                        System.out.println(ste);
                    }
                }
        }