我从商业产品中获得了这段代码。我相信当this.result为null时,它将始终抛出java.lang.NullPointerException异常。我是对的吗?
private void closeCurrentResult() throws SQLException {
this.lastUpdateCount = -1;
if(this.result != null) {
this.result.close();
}
this.result = null;
}
如果this.result为null,那么
this.result = null
相当于
null = null;
虽然导致了NPE。
在阅读了一些回复后,我认为事情变得清晰了。我也做了一个测试,如下所示:
public class NullTest {
public static void main(String[] args) {
ABC a = new ABC(null);
a.test();
}
static class ABC {
Object result;
ABC(Object result) {
this.result = result;
}
void test() {
if (this.result != null) {
System.out.println("do something");
}
this.result = null;
}
}
}
它运作得很好。
答案 0 :(得分:2)
让我们一步一步地完成它:
首先this.lastUpdateCount = -1;
除了将全局成员变量设置为-1
之外什么都不做。
if(this.result != null)
这一个(保护条款)测试result
null
是this.result.close();
,如果不是close()
result
方法this.result = null;
} 叫做。警卫说,这样做是安全的。之后result
将null
设置为null。
在此代码块之后,确保了两件事:
1) this.result为this.result
2)如果open
有close
,那么现在this.result =
如果this.result为null,则this.result = null等效于null = null;
data.dat
是一个赋值语句:您正在为this.result分配一些内容,其值可能为null。此操作是NPE安全的。
答案 1 :(得分:0)
您发布的代码不会抛出空指针异常。但是在将结果设置为null之后,您尝试访问任何会抛出空指针异常的方法。
public class Node {
private int value;
private Node left;
private Node right;
...
//in-order traversal
public void inOrder() {
if (left != null) {
left.inOrder();
}
System.out.println(value);
if (right != null) {
right.inOrder();
}
}
}