为什么我的三元运算符中出现NullPointerException?

时间:2019-05-22 11:15:25

标签: java nullpointerexception ternary-operator

即使我明确检查列表的值是否为NullPointerException,我的三元运算符也会抛出null。但是,如果我在三元运算符周围加上括号,则我的代码有效。

不带括号的代码(引发异常):

final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " + 
        listData != null ? listData.size() : 0);

带括号的代码(可以正常工作):

final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " + 
        (listData != null ? listData.size() : 0));

有人可以解释一下它是如何工作的。

3 个答案:

答案 0 :(得分:8)

这与precedence个运算符有关:字符串+的优先级比后面的三元运算符高。

因此,您的第一个片段实际上是这样做的:

( "Insert new data (Created Monitorings) : " + listData ) != null 
  ? listData.size() : 0

含义:连接一个字符串(具有空listData),并将其与null进行比较。显然,连接的字符串不为null。因此,您确实呼叫了listData.size()。类似于null.size(),它会导致您的NullPointerException。

您正在将错误与否进行比较!在第二个代码段中,(括号)确保将三元运算的结果添加到您的字符串中。

答案 1 :(得分:1)

在代码段一中,与空值比较的值为"Insert new data (Created Monitorings) : " + listData

答案 2 :(得分:0)

'+'的优先级高于'!='

因此,摘录1转换为:

(“插入新数据(创建的监视程序):” + listData)!= null?listData.size():0;

表达式不为null,因此它将继续进行listData.size()。但由于它为null,因此会引发异常。