空指針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 }
執行結果: