【问题标题】:How can a stacktrace show an NPE from code that can't throw an NPE?堆栈跟踪如何从无法抛出 NPE 的代码中显示 NPE?
【发布时间】:2022-07-18 20:11:55
【问题描述】:

给定的代码已经两年没有碰过,而且之前从未遇到过这样的问题,是否有任何关于此堆栈跟踪的解释:

at java.lang.Thread.run(Thread.java:818)\nCaused by: java.lang.NullPointerException
at xxx.Whatever.foo(Whatever.java:1195)
at xxx.Whatever.bar(Whatever.java:1182)

该类中的第 1182 行,在 bar() 方法中:

foo(someArguments)

该类中的第 1195 行,在 foo() 方法中:

 if (typeContainer != null && typeContainer.getEnumConstant() == TypeEnum.SOME_TYPE) 

我不明白这个 NPE 堆栈跟踪是如何实现的。上面那一行不会抛出 NPE。

那么,有什么合理的解释吗?

注意:“当然”NPE 不能被复制。当我对提供该堆栈跟踪的系统运行相应的测试时(在 4 周前的功能测试期间),没有 NPE,并且测试给出了预期的结果。

【问题讨论】:

  • 您有多确定代码在 NPE 发生和您查看/测试有效之间没有变化?
  • 这东西是在线程中运行的吗?另一个线程是否可以访问typeContainer,以便在通过null 的检查后可以同时将其设置为null
  • @kutschkem Git 告诉我代码是 2 年前这样编写和发布的,从那时起就没有动过。
  • 也许你在 NPE 发生时内存有问题。据我所知,这可能会发生,但很少见。这也可以解释这是 2 年来第一次发生,而且无法重现
  • 真的很难让我明白这一点。如果询问者是 GhostCat 以外的人,我可能会不加思索地忽略它。但这太奇怪了。我不认为有任何其他方法可以以意想不到的方式改变typeContainer 的值?

标签: java nullpointerexception


【解决方案1】:

事实证明:显示此错误的特定系统在无效代码加载下运行。看起来系统已经好几个月没有更新了,另一方面,安装了小的“私人”修复程序,从而导致代码级别无效。

因此最可能的解释是:系统上的代码由于某种原因缺少检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-08-07
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多