Java 运算符优先级-算术运算符和条件运算符

Java 运算符优先级-算术运算符和条件运算符,java,operator-precedence,Java,Operator Precedence,我想理解为什么下面的代码抛出空指针异常 import java.util.List; 公开课考试{ 公共静态void main(字符串[]args){ 列表名称=空; System.out.println(“结果是:”+names==null?null:names.size()); } } 纠正Jigar的答案,这实际上是可行的: 要修复OP的代码,只需添加括号-这样操作将按照正确的顺序执行,结果将与预期一致: System.out.println("Result is: " + (names

我想理解为什么下面的代码抛出空指针异常

import java.util.List;
公开课考试{
公共静态void main(字符串[]args){
列表名称=空;
System.out.println(“结果是:”+names==null?null:names.size());
}
}

纠正Jigar的答案,这实际上是可行的:

要修复OP的代码,只需添加括号-这样操作将按照正确的顺序执行,结果将与预期一致:

System.out.println("Result is: " + (names == null ? null : names.size()));

问题在于,您的打印对账单的评估如下:

System.out.println(("Result is: " + names) == null ? null : names.size());
这是由于这样的事实,因为字符串“Result is null”不等于
null
,计算
names.size()
会抛出NPE

请注意,在字符串串联中使用
null
时,它会自动转换为
“null”
。所以,
“结果是:“+null
不会抛出
NPE
。这是根据:

如果引用为
null
,它将转换为字符串
“null”
(四个ASCII字符n、u、l、l)

若要解决此问题,应在条件表达式周围添加括号,以增强其相关性:

System.out.println("Result is: " + (names == null ? null : names.size()));
您正在编写的“结果是:“+names不等同于null,因此它试图打印
names.size()
。但是当调用
names.size()
时,它会抛出空指针异常,因为名称仍然为空

修改

System.out.println("Result is: " + names == null ? null : names.size());


然后您将得到null作为输出。

也许您想要name==null<代码>0:names.size()
System.out.println("Result is: " + (names == null ? null : names.size()));
System.out.println("Result is: " + names == null ? null : names.size());
System.out.print("Result is: ");
System.out.println( names == null ? null : names.size());