JAVA三元操作符的一个坑

    最近同事分享了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

 

猜你喜欢

转载自labreeze.iteye.com/blog/2357482