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

Pra*_*shi 4 java ternary-operator nullpointerexception

NullPointerException即使我明确检查列表的值是否为,我的三元运算符也将引发null。但是,如果我在三元运算符周围添加括号,则我的代码将起作用。

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

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

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

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

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

Gho*_*ica 8

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

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

( "Insert new data (Created Monitorings) : " + listData ) != null 
  ? listData.size() : 0
Run Code Online (Sandbox Code Playgroud)

含义:您连接一个字符串(带有null listData),然后将其与null进行比较。显然,连接的字符串不为null。因此,您确实致电listData.size()。这类似于null.size()导致您的NullPointerException的原因。

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