今天很好奇, 对 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 对象并没有被实例化 (分配空间), 因而运行时会报空指针错误.
来源: http://www.bubuko.com/infodetail-3265525.html