在Java中将null赋值为null

时间:2015-05-03 14:14:33

标签: java

我从商业产品中获得了这段代码。我相信当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;
        }
    }
}

它运作得很好。

2 个答案:

答案 0 :(得分:2)

让我们一步一步地完成它:

首先this.lastUpdateCount = -1;除了将全局成员变量设置为-1之外什么都不做。

if(this.result != null)

这一个(保护条款)测试result nullthis.result.close();,如果不是close() result方法this.result = null; } 叫做。警卫说,这样做是安全的。之后resultnull设置为null。

在此代码块之后,确保了两件事:

1) this.result为this.result

2)如果openclose,那么现在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();
        }
    }
}