关于nul强制转换的问题

前言:今天在研究shiro的时候发现一个这么一个写法,如下图所示:

这是一个SimpleAccountRealm里面的两个方法.下面的addAccount重载于上面的addAccount method,

在第一个addAccount方法中,我第一眼看上去感觉很奇怪.为什么这个第三个参数要强转一遍????这样强转不会出现NullPointerException???

介绍一下源码版本.shiro-core 1.2.3 , 感兴趣的同学可以去看看

1.为什么不会出错

先附上一段测试案列:

        Object a = null;
        try {
            String[] b = (String[]) a;
        }catch (NullPointerException e){
            System.out.println("转换错误");
        }

我们来看看上面这段代码.首先.我们在栈中新建了一个局部变量a,因为a没有实例化对象.所以这个a的值是没有数据的.然后再执行下面一行代码.我们把a的值拿出来赋值给b.因为a没有值.所以这个b也是为null.并不会因为抛出错误.

由此延伸出来的问题:

public class SimpleTest {

    public static void now(){
        System.out.println("当前index为: " + 1);
    }

    @Test
    public void nullConvertTest(){
        Object a = null;
        try {
            String[] b = (String[]) a;
        }catch (NullPointerException e){
            System.out.println("转换错误");
        }

        
        ((SimpleTest)null).now();
        
    }

}

新建一个SimpleTest类.类里面有一个静态方法now.现在我强制转换一个null为SimpleTest类型.并调用他的静态方法.会出错吗?

结果也是不会的.众所周知.我们的jvm在内存中开辟了一个方法区.这个方法区专门用来存放class类及静态方法.

当我们在强转为SimpleTest类时.也就相当于获得了这个类的引用.静态方法now归属于方法区.和实例无关.所以执行结果是:"当前index为: 1"

2.为什么这样写?

在实际开发中.我见的最多的就是要么传个null进去.要么就直接new个String数组.不太建议null一个对象.这样每次调用的时候.都会在使得jvm在堆中初始化一个对象.如果该方法调用频率非常高.那么是一件非常大的内存消耗.

至于为什么这么写.其实我也百思不得其解,也在百度,包括Google都没有相关的QA,以后再补充吧.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值