前言:今天在研究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,以后再补充吧.