關於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 }

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM