public static void main(string[] args) {
string a=null; if("aa".equals(a))//这种情形,不出现空指针异常
//if(a.equals("aa"))//出现空指针异常
{
system.out.println(true);
} else {
system.out.println(false);
}
}
上面的两句不同的比较语句测试,第一句不出现空指针异常,第二句出现。
所以在变量和常量比较的时候,一般把常量放在前面。为了避免空指针异常。
但是我的问题是:变量在前时候,读到变量,变量为空,就出现异常了。
为什么变量在后时候,a变量就不用读了吗?既然要比较肯定也要读啊,问题
只是先后的问题。为什么放在后面就就不报空指针呢?
之前对这个问题,在公司上班的时候,听到别人说这样的写法是为了避免空指针。的确我验证了一下,是可以避免空指针。后来想深究上面的我提出的问题时候,老同事告诉,这也是形成了一种编程规范。今天想想规范,也有一定的理由。
今天在我们的技术交流群里面有出现了这个问题,有引发了我的深思。
于是发了个帖子,
看了一下string类的equals方法
public boolean equals(object anobject) {
if (this == anobject) {
return true;
}
if (anobject instanceof string) {
string anotherstring = (string) anobject;
int n = value.length;
if (n == anotherstring.value.length) {
char v1[] = value;
char v2[] = anotherstring.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
但是我的问题有来了
源码我看了一下,也明白,但是在源码中如果anobject为空的时候,就不会出现空指针异常吗 ?
后来经过一番讨论后,我得出的结论是这样的。
问题是出现在调用方法上了。因为null值,并不是一个string对象。而你通过声明的string对象引用去 调用了string对象的实例方法。当然不可以了。null调用了方法。
所以系统报出了,空指针异常。
所以说,呼应文章的标题,这样还真的是避免了控制针异常。毕竟“aaa”这样的形式,不是null形式,是可以调用方法的。接着我们在按string类里面的equals方法做比较就ok的啦。
更多aa.equals(a)这种写法为什么就可以避免空指针。。