在Java中为null赋值

在Java中为null赋值,java,Java,我从一个商业产品中得到了这段代码。我相信当this.result为null时,它将始终抛出java.lang.NullPointerException异常。我这样说对吗 private void closeCurrentResult() throws SQLException { this.lastUpdateCount = -1; if(this.result != null) { this.result.close(); } this.res

我从一个商业产品中得到了这段代码。我相信当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;
        }
    }
}
而且效果很好。

不,你不是

这:

仅当this.result不为null时调用
close()
,正确。 如果检查是
This.result!=空

最后一行:

this.result = null;
只需将
this.result
设置为
null
,此处也没有错误。

不,您没有错误

这:

仅当this.result不为null时调用
close()
,正确。 如果检查是
This.result!=空

最后一行:

this.result = null;

只需将
this.result
设置为
null
,此处也没有任何错误。

让我们一步一步地检查它:

first
this.lastUpdateCount=-1
只将全局成员变量设置为
-1

if(this.result != null)
这一个(保护子句)测试
result
是否为
null
如果不是这样
This.result.close()调用
result
上的
close()
方法。警卫说,这样做是安全的。之后
this.result=null
结果设置为空

在这个代码块之后,有两件事是可以保证的:

1)此结果为
null

2)如果
这个结果
打开了某个
文件
它现在是
关闭了

如果this.result为null,则this.result=null等同于null=null


this.result=
是一个赋值语句:您正在给this.result赋值,其值可能为null。此操作是NPE安全的。

让我们一步一步地进行:

first
this.lastUpdateCount=-1
只将全局成员变量设置为
-1

if(this.result != null)
这一个(保护子句)测试
result
是否为
null
如果不是这样
This.result.close()调用
result
上的
close()
方法。警卫说,这样做是安全的。之后
this.result=null
结果设置为空

在这个代码块之后,有两件事是可以保证的:

1)此结果为
null

2)如果
这个结果
打开了某个
文件
它现在是
关闭了

如果this.result为null,则this.result=null等同于null=null


this.result=
是一个赋值语句:您正在给this.result赋值,其值可能为null。此操作是NPE安全的。

结果类似于内存地址的标签。当
result
不是
null
时,它指向存在对象的某个内存地址


当您使用赋值运算符
=
时,如
result=null
中所述,您的意思是,“使
result
指向
null
,我不在乎它最初指向的是什么”。因此,无论
result
当前指向的是什么都不重要,即使它是
null
,将
result
重新分配到
null
也不会抛出NPE。

结果
就像一个指向内存地址的标签。当
result
不是
null
时,它指向存在对象的某个内存地址

当您使用赋值运算符
=
时,如
result=null
中所述,您的意思是,“使
result
指向
null
,我不在乎它最初指向的是什么”。因此,无论
result
当前指向什么都无关紧要,即使它是
null
,将
result
重新分配到
null
也不会抛出NPE。

否。。
this.result=null
只是将null引用分配给
this.result

只有当
this==null
时,它才会抛出NPE,这是…从不

NPE意味着您在空引用上调用了一个方法或引用了一个属性。也就是说,当您的代码如下所示:

obj.someProperty
obj.someMethod()
obj本身为空时

顺便说一句,null引用是一种特殊引用(而不是特殊值或某些编译时机制)

  • 所有空引用都相同(相同引用)

  • 空引用是引用类型变量的“默认值”

    class Person{
        String name;  // `name` is null until assigned otherwise.
    }
    
  • 取消绑定空引用变量时将抛出NPE

    Integer a = null;
    int b = a;  // throws NPE.
    
  • 许多JDK方法特别威胁空引用(这是好的也是坏的)

  • 另一个例子:

        String b = null;
        String a = String.valueOf(b);
        // a is String "null" instead of null reference. Because:
        // String.java:
        public static String valueOf(Object var0) {
            return var0 == null?"null":var0.toString();
        }
    
    没有。。
    this.result=null
    只是将null引用分配给
    this.result

    只有当
    this==null
    时,它才会抛出NPE,这是…从不

    NPE意味着您在空引用上调用了一个方法或引用了一个属性。也就是说,当您的代码如下所示:

    obj.someProperty
    obj.someMethod()
    obj本身为空时

    顺便说一句,null引用是一种特殊引用(而不是特殊值或某些编译时机制)

  • 所有空引用都相同(相同引用)

  • 空引用是引用类型变量的“默认值”

    class Person{
        String name;  // `name` is null until assigned otherwise.
    }
    
  • 取消绑定空引用变量时将抛出NPE

    Integer a = null;
    int b = a;  // throws NPE.
    
  • 许多JDK方法特别威胁空引用(这是好的也是坏的)

  • 另一个例子: