今天很好奇,對null進行強轉會不會拋錯。做了如下測試得到的結果是,
如果把null強轉給對象,是不會拋異常的,本身對象是可以為null的。
但是如果是基本類型,比如 int i = (Integer)obj的強轉,其實內部會調用intvalue方法去賦值給基本類型,所以這時候是會報錯的。
代碼如下
Object obj = null;
Integer s1 = (Integer)obj;
上面能正常執行,即把null賦值給一個對象或者強行類型轉換賦值給對象都是沒有問題的。如果s1是 int的基本類型呢?
代碼如下,編譯時不會報錯
int s1 = (Integer)obj;
System.out.println(s1);
執行,則報java.lang.NullPointerException錯誤。
我們反編譯后會發現調用了 intValue方法去獲取value,所以拋出空指針錯誤:
Object obj = null;
int s1 = ((Integer)obj).intValue();
System.out.println(s1);
---------------------
public class NULL {
private static final String TAG = "NULL";
private void abc(){
System.out.println("123");
}
public static void main(String[] args) {
((NULL)null).abc();
}
}
以上代碼運行時會報錯:
Exception in thread "main" java.lang.NullPointerException
at com.test.NULL.main(NULL.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
若將方法abc加上靜態修飾符static
public class NULL {
private static final String TAG = "NULL";
private static void abc(){
System.out.println("123");
}
public static void main(String[] args) {
((NULL)null).abc();
}
}
程序正常運行,輸出
123
1
null可以被強制類型轉換成任意類型的對象,通過這樣的方式可以執行對象的靜態方法,但如果方法不是靜態方法的話,由於null對象並沒有被實例化(分配空間),因而運行時會報空指針錯誤。