为什么我的三元运算符会出现 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()。但是因为它是空的,所以它抛出异常。
我的三元运算符抛出 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()。但是因为它是空的,所以它抛出异常。