在Java中为null赋值
我从一个商业产品中得到了这段代码。我相信当this.result为null时,它将始终抛出java.lang.NullPointerException异常。我这样说对吗在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
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
,此处也没有任何错误。让我们一步一步地检查它:
firstthis.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安全的。让我们一步一步地进行:
firstthis.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方法特别威胁空引用(这是好的也是坏的)
另一个例子: