一道关于三目运算符的试题详解

在我的另一个网站中,第一道笔试题是这样的:

1.Java中,运行以下语句的输出是什么? 
try {
  System.out.println(true?(Integer)null:1);
} catch (NullPointerException e) {
  System.out.println(6);
}

 
A. null
B. 6
C. 1
D. 0

 

正确答案是B:6

本身 null 进行强转不会有任何问题;

那么,这是怎么回事呢?

假如是

System.out.println(false?(Integer)null:1);

则会输出1

 

假如是

System.out.println(true?(String)null:1);

则会输出 null

假如是

System.out.println(true?(Byte)null:1);

则还是会空指针

假如是

System.out.println(true?(Boolean)null:1);

则会输出 null

假如是

System.out.println(true?(Boolean)null:false);

则还是会空指针

 

原来,是这个三目运算符捣的鬼:

当三目运算某一项A成立的时候,会根据另一个值B的类型来判断:如果B是基本类型且当前即将输出的值(A)拆箱后都为数值或都为布尔,那么Java将会尝试把包装类拆箱变为基本类型输出,假如此时变量的值为null则会引起空指针异常。

  那么,如下的代码有可能就会有隐含的问题不被发现

Integer n = getValue();

doSomething(condition ? n : 1);//只当 condition 为 true 且 n 为 null 时存在空指针异常

 

平日开发中要注意避免哦~

 

 

评论区
回复