三目运算符的坑

三目运算符中的坑不容易发现,看一段代码

1
2
3
4
5
6
public class Test {
public static void main(String[] args) {
Long test = null;
Long a = 2 > 1 ? test : 0L;
}
}

Exception in thread “main” java.lang.NullPointerException
at Test.main(Test.java:11)

报的NPE,这个地方报NPE,着实想不到,只能看下字节码

1
javap -v Test.class > output.txt

结果是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 10: 0
line 11: 2
line 12: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 args [Ljava/lang/String;
2 9 1 test Ljava/lang/Long;
10 1 2 a Ljava/lang/Long;

经过自动的拆箱和装箱,至于为何要经过这么一步处理 @Sun @Oracle 😂