关于null的几种处理方式

空指针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 }

执行结果:

 

posted @ 2021-01-30 23:26  Eleanor123  阅读(2009)  评论(0编辑  收藏  举报