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());