我正在调试一个旨在优雅处理foo
null
个案的应用程序。但是,在从生产中检查日志时,在NullPointerException
之后,尝试访问foo
方法时,会优先处理该方法。
看起来像这样
if (foo == null) {
throw new GracefulException();
}
Bar bar = foo.getBar();
使用该代码时,调用NullPointerException
时生产中出现foo.getBar()
。
我的问题很简单:有没有人听说过这样的时髦行为,甚至可能发生?如果是这样,可能导致什么呢?
答案 0 :(得分:7)
检查调用堆栈;可能来自getBar()
内部。
此外,如果foo
不是局部变量,则某些其他线程可能会在if
之后将其设置为空。
答案 1 :(得分:1)
No.
foo == null
can never befalse
, iffoo
isnull
.
There could be these possible cases:
foo
is a local variable, this case is not applicable here.foo.getBar()
. This case can be easily identified by the stack trace getting generated. Check if the method name is present in the stack trace.For example, consider below code:
public class Temp {
public static void main(String[] args) {
new Temp().functionA();
}
void functionA() {
Foo foo = new Foo();
//foo = null; //Line 1
String str = foo.getBar();
}
}
class Foo {
Object x = new Object();
public String getBar() {
//x = null; //Line 2
return x.toString();
}
}
If foo
is null
(Line 1 not commented), stack trace would be like:
Exception in thread "main" java.lang.NullPointerException
at Temp.functionA(Temp.java:9)
at Temp.main(Temp.java:3)
If x
is null
(Line 2 not commented), stack trace would be like:
Exception in thread "main" java.lang.NullPointerException
at Foo.getBar(Temp.java:16)
at Temp.functionA(Temp.java:8)
at Temp.main(Temp.java:3)
答案 2 :(得分:1)
如果堆栈跟踪中提到foo.getBar()
,则会在该方法中抛出异常,并且您在错误的位置查找。
如果堆栈跟踪的顶部是包含此foo.getBar()
次呼叫的方法,则foo
为null
。
既然你写了foo
是一个局部变量,由于某些其他线程的干扰,这是而不是 - 另一个线程永远不能设置局部变量的值(大多数它可以做正在修改它的内容。
foo
到null
的语句设置。GracefulException
。