80

在 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

有谁知道如何获得完整的堆栈跟踪显示(即显示其他 113 行)?


Throwable的JavaDocs (for Java 7)对正在发生的事情进行了非常详细的解释。

4

6 回答 6

75

当您看到“...113 更多”时,这意味着“由”异常的剩余行与父异常从该点开始的剩余行相同。

例如,您将拥有

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>.

两个堆栈跟踪在 AbstractBatcher.executeBatch 第 242 行“相遇”,然后从那时起向上的调用跟踪与包装异常相同。

于 2009-01-13T02:20:22.470 回答
20

Apache 的Commons Lang提供了一个很好的 util 方法ExceptionUtils.printRootCauseStackTrace(),它可以“颠倒”打印嵌套的堆栈跟踪。结果更加直观。

如果您在 printStackTrace() 方法的原始结果旁边看到结果,就会清楚“113 more”行的去向。

于 2009-01-13T09:41:00.147 回答
20

增加-XX:MaxJavaStackTraceDepthJVM 选项。

于 2018-05-02T06:11:16.910 回答
14

我喜欢这里的例子:

HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more

基本上在源代码中,main调用function a哪个调用function b哪个调用...哪个调用function eFunction ethrows aLowLevelException导致函数 c 捕获LowLevelException并抛出 a MidLevelException(将实例包装在LowLevelException实例内部MidLevelExceptionException该类具有能够接收不同异常的构造函数,将其包装起来)。这导致函数 a 捕获MidLevelException并抛出 aHighLevelException现在包装了前两个Exception实例。

如其他答案所述,堆栈跟踪并没有真正被截断,您看到的是完整的堆栈跟踪。在.. .3 more我的示例中存在,因为否则它将是多余的。如果你想冗余和浪费输出线,.. 3 more可以用

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

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

于 2014-12-20T14:09:13.170 回答
0

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

        ... 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);
                    }
                }
        }
于 2019-01-01T13:09:56.843 回答
-2

在一篇博客文章中,我刚刚描述了如何获得不仅仅是“BatchUpdateException:失败的批处理”:设置hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory为禁用休眠中的批处理。通常可以使用BatchUpdateException.getNextException来获取失败的原因,但在某些情况下可能会返回null。然后完全禁用批处理很有用。

于 2012-11-18T23:26:47.167 回答