先说结论,当非基础类型和基础类型比较时,会将非基础类型强转成基础类型后,并使用.equals进行比较, 若此时.equals前的字段为空,那么就会出现空指针。
看下面的例子,理解一下。
public static void main(String[] args) {
//不会报空指针 因为他们都是Byte 使用==比较就是比较他们的值是否相等
Byte byteNull = null;
Byte byte100 = 100;
System.out.println(byteNull == byte100);
//会报空指针, 因为当非基本类型byte在和Byte进行比较的时候,会进行强转转为Byte,之后用 byteNull.equals(300)进行比较,由于byteNull是null,所以就会空指针了。
System.out.println(byteNull == (byte)300);
//会报空指针,因为非基础类型boolean在和Boolean进行比较的时候,会进行强转转为Boolean,之后用 b.equals(true)进行比较,由于b是null,所以就会空指针了。
Boolean b = null;
boolean a = true;
System.out.println(b == a);
}
单独把String拿出来说一下
//String是一个对象(引用类型),当使用==比较两个字符串对象时,它比较的是这两个对象的引用是否相同,即它们是否指向堆内存中的同一个地址。在这个例子中,b == "111"实际上是判断b这个引用是否指向字符串常量池中的"111"。因为b是null,null与任何非null对象使用==比较都会返回false,所以这段代码不会抛出NullPointerException,只是结果为false。
String stringNull = null;
String string111 = "111";
System.out.println(stringNull== string111);
如何避免? 使用万能的Objests.eqauls比较两个对象。
正确写法
public static void main(String[] args) {
//不会报空指针,因为他们都是String, 使用== 就是判断他们是否都是基础类型,不存在强转。
String stringNull = null;
String string111 = "111";
Objects.equals(stringNull, string111);
//System.out.println(stringNull== string111);
//不会报空指针 因为他们都是Byte 使用==比较就是比较他们的值是否相等
Byte byteNull = null;
Byte byte100 = 100;
Objects.equals(byteNull, byte100);
//System.out.println(byteNull == byte100);
//会报空指针, 因为当非基本类型byte在和Byte进行比较的时候,会进行强转转为Byte,之后用 byteNull.equals(300)进行比较,由于byteNull是null,所以就会空指针了。
//System.out.println(byteNull == (byte)300);
Objects.equals(byteNull, (byte)300);
//会报空指针,因为非基础类型boolean在和Boolean进行比较的时候,会进行强转转为Boolean,之后用 b.equals(true)进行比较,由于b是null,所以就会空指针了。
Boolean b = null;
boolean a = true;
//System.out.println(b == a);
Objects.equals(b,a);
}
```