空指针NullPointerException是经常会遇到的问题,关于null的特点如下:
第一,大小写敏感
第二,null是任何引用类型的初始值
null是所有引用类型的默认值,也就是所有Object类下的引用类型默认值都是null,这对所有的引用变量都使用。
第三,null既不是对象也不是类型,它是一种特殊的值,可以将它赋值给任何引用类型
1 package day05; 2 3 4 5 public class Demo02 { 6 7 public static void main(String[] args) { 8 9 String s1 = null; 10 11 Integer i = null; 12 13 Double dou = null; 14 15 System.out.println(s1); 16 17 System.out.println(i); 18 19 System.out.println(dou); 20 21 System.out.println("------------"); 22 23 Integer integer = (Integer) null; 24 25 String string = (String) null; 26 27 System.out.println("interger=" + integer); 28 29 System.out.println("string=" + string); 30 31 32 33 34 35 } 36 37 }
执行结果:
可以看到编译器和运行期内,将null转换成任何的引用类型都可以,不会抛出空指针异常。
第四,null不能赋值给基本数据类型
1 package day05; 2 3 4 5 public class Demo03 { 6 7 public static void main(String[] args) { 8 9 int a = 0; 10 11 Integer it = null; 12 13 System.out.println( it == a); 14 15 } 16 17 }
执行结果:
第五,将null赋给包装类,自动拆箱会包NPE
第六,带有null的引用类型变量,instanceof会包false
1 package day05; 2 3 4 5 public class Demo04 { 6 7 public static void main(String[] args) { 8 9 Integer isNull = null; 10 11 //instanceof = isInstance方法 12 13 if (isNull instanceof Integer) { 14 15 System.out.println("isNull is instanceof Integer"); 16 17 } else { 18 19 System.out.println("isNull is not instanceof Integer"); 20 21 } 22 23 } 24 25 }
执行结果:
这是instanceof操作符一个很重要概念,这对类型强制转换检查很有用。
第七,静态变量为null调用静态方法不会抛出NPE
静态变量为null调用静态方法不会抛出NullPointerException,因为静态方法使用了静态绑定。
第八,使用null值安全的方法
1 package day05; 2 3 4 5 public class Demo05 { 6 7 private static String num; 8 9 10 11 public static void main(String[] args) { 12 13 String s = String.valueOf(num); 14 15 String string = num.toString(); 16 17 System.out.println("s=" + s); 18 19 System.out.println("string=" + string); 20 21 } 22 23 }
执行结果:
Num没有赋值,所以默认值为null,使用String.value(num)静态方法没有抛出异常,但是使用toString()却抛出了空指针异常。所以尽量使用对象的静态方法。
第九,使用==或!=判断null
可以使用==或者!=操作来比较null值,但是不能使用其他算法或逻辑操作,例如小于或者大于。Java中null ==null将返回true,如下所示:
1 package day05; 2 3 4 5 public class Demo06 { 6 7 private static String s1; 8 9 private static String s2; 10 11 12 13 public static void main(String[] args) { 14 15 System.out.println("s1 == s2 ?" + s1 == s2); 16 17 System.out.println(null == null); 18 19 } 20 21 22 23 }
执行结果: