zoukankan      html  css  js  c++  java
  • 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对象并没有被实例化(分配空间),因而运行时会报空指针错误。

  • 相关阅读:
    go反射实现实体映射
    golang的time包:秒、毫秒、纳秒时间戳输出
    在 Gin 框架中使用 JWT 认证
    docker安装redis
    docker安装mysql5.7
    Python Web实战:Python+Django+MySQL实现基于Web版的增删改查
    apache2.4配置weblogic12c集群(linux环境)
    小BUG大原理:重写WebMvcConfigurationSupport后SpringBoot自动配置失效
    Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
    Git进阶:常用命令和问题案例整理
  • 原文地址:https://www.cnblogs.com/renyuanwei/p/11767276.html
Copyright © 2011-2022 走看看