[英]Operator precedence - Arithmetic and Conditional operators
我想了解为什么以下代码抛出Null指针异常 。
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> names = null;
System.out.println("Result is: " + names == null ? null : names.size());
}
}
问题是您的print语句被评估为:
System.out.println(("Result is: " + names) == null ? null : names.size());
这是因为+
优先级高于?:
运算符因此,由于字符串 - “Result is null”不等于null
,因此计算names.size()
会抛出NPE。
请注意,在字符串连接中使用null
时,它会自动转换为"null"
。 所以, "Result is: " + null
不会抛出NPE
。 这是根据JLS - 字符串转换 :
如果引用为
null
,则将其转换为字符串"null"
(四个ASCII字符n,u,l,l)。
要解决此问题,您应该在条件表达式周围添加括号,以强制对它进行更大的优先级:
System.out.println("Result is: " + (names == null ? null : names.size()));
纠正Jigar的答案,这实际上有效 :
someString + null
要修复OP的代码,只需添加括号 - 这样操作将按正确的顺序执行,结果将如预期:
System.out.println("Result is: " + (names == null ? null : names.size()));
你正在写“结果是:”+名称不等于null所以它试图打印names.size()
。 但是当names.size()
时,它会抛出空指针异常,因为名称仍然为null。
修改
System.out.println("Result is: " + names == null ? null : names.size());
至
System.out.print("Result is: ");
System.out.println( names == null ? null : names.size());
那么你将得到null作为输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.