JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)

Posted 上尤流苏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)相关的知识,希望对你有一定的参考价值。

 

今天很好奇,对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对象并没有被实例化(分配空间),因而运行时会报空指针错误。

 

以上是关于JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)的主要内容,如果未能解决你的问题,请参考以下文章

null 不能强制转换为非 null 类型 kotlin.String NullPointer 异常

java 中各种数据类型转换byte[]的方法

在java中使用null进行类型转换时没有异常

Web | JavaScript的引用数据类型强制转换类型

java加法运算 (强制类型转换)

《你不知道的JavaScript》整理——强制类型转换