即使我明确检查列表的值是否为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));
有人可以解释一下它是如何工作的。
答案 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,因此会引发异常。