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

Why I am getting NullPointerException in my 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));

谁能解释一下它到底是如何工作的。

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

这大约是 precedence 个运算符:String+ 的优先级比后面的三元运算符高得多。

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

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

意思是:你连接了一个字符串(带有一个空值 listData),并将它与空值进行比较。显然,连接后的字符串不为空。因此你确实调用了 listData.size()。这类似于 null.size() 导致您的 NullPointerException。

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

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

因此代码段 1 转换为:

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

表达式不为空,因此它继续 listData.size()。但是因为它是空的,所以它抛出异常。