最近同事分享了coding过程中的一个坑,自己就写了个demo尝试了下,觉得很有意思,拿出来分享下。
场景:
下面的代码一执行会出现NPE的异常,但是仔细看了下代码怎么也不应该出现NPE异常。
public class A { public static void main(String[] args) { Long test = null; Long a = 2 > 1 ? test : 0L; } }
分析:
无奈,唯有拿个字节码工具出来下,看看Java底层是怎么走的。细分析下才恍然大悟,但是为啥要做一次拆箱和装箱呢,这个估计只能问语言的设计者了。
0:null 压入栈顶
扫描二维码关注公众号,回复:
514515 查看本文章
1: null 压出赋值给第一个变量
2:第一个变量压入栈顶
3:执行实例的.longValue方法
6:执行静态方法 Long.longValue转化成Long
9. 压出栈顶元素赋值给的第二个变量
10:结束
// javap -verbose A public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=3, args_size=1 0: aconst_null 1: astore_1 2: aload_1 3: invokevirtual#2 //Method java/lang/Long.longValue:()J 6: invokestatic #3 //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 9: astore_2 10: return LineNumberTable: line 4: 0 line 5: 2 line 6: 10