【发布时间】: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的值?