java三⽬运算符
三⽬运算以及⾃动拆箱导致的NPE
System.out.println(false ? 1 : (Long)null); // NPE
System.out.println(false ? Long.valueOf(1L) : (Long)null);
System.out.println(false ? 1 : (String) null);
使⽤ javap -v 查看字节码可以看到
9: invokevirtual #35 // Method java/lang/Long.longValue:()J
12: invokevirtual #39 // Method java/io/PrintStream.println:(J)V
15: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
18: aconst_null
19: checkcast #33 // class java/lang/Long
22: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
25: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
28: aconst_null
29: checkcast #42 // class java/lang/String
32: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
可以看到 " false ? 1 : (Long)null" 中对应的关键的代码 Long.longValue(); 正式由于⾃动拆箱的操作导致了NPE;
java valueof当三⽬运算条件为false时,当":"左侧为基本数据类型,⽽右侧为基本类型的包装类型时,则会引发包装类型的⾃动拆箱操作;(这句话更完整的解释为,当根据条件判断时,如果选择的表达式为基本类型的包装类型,⽽未被选择的表达式为基本类型,则选择的结果会⾃动进⾏拆箱操作); 因此当 ((Long)null).longValue()被执⾏时则会抛出NPE
以下是官⽅⽂档的解释
If one of the operands is of type T, where T is Byte, Short, or Character, and the other operand is a constant expression () of
type int whose value is representable in the type U which is the result of applying unboxing conversion to T, then the type
of the conditional expression is U.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论