自动拆箱的bug

在这看到的代码,第二次调用 fun时,出NULL指针异常,看了下面网友的分析,针对这题还是不太明白,朋友们再讲解下...
public class Test {
public static void main(String[] args) {
// print "foo"
fun(null);

// NullPointerException
int i = 2;
fun(i == 0 ? true : (i == 1 ? false : null));
}

private static void fun(Boolean b) {
System.out.println("foo");
}
}


自动拆箱引发的bug,看这段代码:
Boolean a = null;
Boolean b = 1 == 0 ? true : a;

这里会被编译为:
首先计算1 == 0的boolean值
然后调用a.booleanValue()返回a的拆箱
然后对三元运算符的结果在进行装箱

在这里a.booleanValue()由于a是null所以就报NullPointer了
附上这段代码编译后的字节码:
0: aconst_null
1: astore_1
2: aload_1
3: invokevirtual #2; //Method java/lang/Boolean.booleanValue:()Z
6: invokestatic #3; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
9: astore_2
10: return


原文http://www.oschina.net/code/snippet_273190_14374
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值