Java 消失异常消息...也许是被压抑的例外?

Java vanishing Exception message... surpressed exception maybe?

提问人:mstabosz 提问时间:3/24/2023 最后编辑:mstabosz 更新时间:4/4/2023 访问量:42

问:

用 Java 编写。这是一个让我感到困惑的问题,而且感觉也超出了我的掌握范围。这是 try 块中的一个小伪代码和 catch 块中的真实代码。

try {

    // 83 lines of code that do a bunch of stuff, with methods that call other
    // methods which call which call other methods

} catch (Exception e) {
    logger.writeLogError("*********FAILURE BEGIN*********\n");
    e.printStackTrace();
    logger.writeLogError("*********FAILURE END*********\n");
    String errorMesg;

    // Any downstream method that throws an exception without a message
    // will have e.getMessage == null
    if(e.getMessage() == null) {
        // This is for an unanticipated exception.  
        // The stack trace should give more information.
        errorMesg = "Skipped.  Unknown exception.  Check logs for string Exception thrown: ";
    } else {
        errorMesg = "Skipped. " + e.getMessage();
    }
}

变量“errorMesg”被写入数据库表。它不会打印到日志中。所以问题来了。在代码深处的某个地方发生了一些事情,引发了 NullPointerException。这是我们在日志文件中看到的内容。

2022-10-25 14:06:28,583 ERROR [com.fdc.gibson.services.orderentry.ThisClass] (WorkerThread#39[192.168.136.172:55767]) ********FAILURE BEGIN********

2022-10-25 14:06:28,584 ERROR [STDERR] (WorkerThread#39[192.168.136.172:55767]) java.lang.NullPointerException
2022-10-25 14:06:28,584 ERROR [com.orderentry.ThisClass] (WorkerThread#39[192.168.136.172:55767]) ********FAILURE END********

我无法弄清楚为什么堆栈跟踪中的信息如此稀疏。我的猜测是内心深处有一个被抑制的异常,只需添加对 e.getSuppressed() 的调用就会解决这个问题。我不确定。但是,为什么堆栈跟踪会被吞噬呢?也许我错过了一些明显的东西。我敢肯定我们在这里做了一些非常愚蠢的事情,但我没有编写大部分代码,我正在努力消除它。

Java 异常 nullpointerException 错误抑制

评论

2赞 f1sh 3/24/2023
在各种情况下,JVM 会停止生成堆栈跟踪。这种情况可能一直被抛出,因此 JVM 尝试通过在 X 次出现后不再创建堆栈跟踪来节省资源。你能重新启动你的jvm并验证这一点吗?
3赞 f1sh 3/24/2023
这回答了你的问题吗?JVM 何时开始省略堆栈跟踪?
0赞 rzwitserloot 3/24/2023
禁止显示的异常与您所描述的内容无关。抑制异常是在处理异常期间发生的异常,几乎可以保证描述相同的一般问题,但堆栈跟踪的用处不大。禁止的异常不会很快丢失其跟踪,添加禁止的异常也不会导致添加到其中的异常丢失其堆栈跟踪。这个解释很可能是上面的 2 条评论引导你去的。
0赞 mstabosz 4/4/2023
嗨,伙计们。对不起,我上周没有跟进。我正在度假,非常彻底地调整了锻炼。f1sh,我点击了您提供的链接,上面写着“另外,根据这个,传递 -XX:-OmitStackTraceInFastThrow 将确保我的 StackTrace 不会丢失。不过,我对如何做到这一点有点困惑。
0赞 mstabosz 6/5/2023
嗨,谢谢你的评论。我有点放弃了试图弄清楚到底是什么引发了 NullPointerException。这是非常罕见的。我说“我们永远不会弄清楚这是从哪里来的”,我建议我们至少通过将 try-catch 块中的一些代码重构为具有自己的 try-catch 块的方法来缓解这种情况。它至少会缩小未来发生这种情况的范围。这个想法被否决了。解决这个问题不是我的责任;所以我就放弃了。没什么大不了的。

答: 暂无答案