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变量就不用读了吗?既然要比较确定也要读啊,问题
只是前后的问题。为何放在后面就就不报空指针呢?java
以前对这个问题,在公司上班的时候,听到别人说这样的写法是为了不空指针。的确我验证了一下,是能够避免空指针。后来想深究上面的我提出的问题时候,老同事告诉,这也是造成了一种编程规范。今天想一想规范,也有必定的理由。编程
今天在咱们的技术交流群里面有出现了这个问题,有引起了个人深思。测试
因而发了个帖子,this
看了一下string类的equals方法spa
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为空的时候,就不会出现空指针异常吗 ?
后来通过一番讨论后,我得出的结论是这样的。code
问题是出如今调用方法上了。由于null值,并非一个String对象。而你经过声明的String对象引用去 调用了String对象的实例方法。固然不能够了。null调用了方法。orm
因此系统报出了,空指针异常。对象
因此说,呼应文章的标题,这样还真的是避免了控制针异常。毕竟“aaa”这样的形式,不是null形式,是能够调用方法的。接着咱们在按String类里面的equals方法作比较就OK的啦。源码