1. 测试
又一次在写代码,突然想到这么个问题:java里的equals比较对象的顺序不同会有什么不同的效果?于是乎写了以下测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
public class Main {
public static void main(String[] args) { TestObject a1 = null; TestObject a2 = new TestObject(); test1(a1, a2); test2(a1, a2); } public static void test1(TestObject a1, TestObject a2) { try { System.out.println("test1:" + a1.equals(a2)); } catch (Exception e) { e.printStackTrace(); } }
public static void test2(TestObject a1, TestObject a2) {
try { System.out.println("test2:" + a2.equals(a1)); } catch (Exception e) { e.printStackTrace(); } }
}
class TestObject { }
|
2. 分析
在test1中抛出java.lang.NullPointerException异常,而test2打印出false,对于test2的情况,查看源码的注释可以知道:
For any non-null reference value x, x.equals(null) should return false.
而对于空指针异常:
引发空指针异常,往往是在获取对象实例地址的时候,由于获取的对象实例并不存在,因此返回的地址为null,而又没进行判断,直接使用了该对象实例(地址)引发的。
3. 总结
因此,这是一个技巧了,为了避免空指针异常,我们在对对象进行比较的时候,得把常量或者我们认为不会有null的值放在前面: “constant”.equals(“object”);