我想了解为什么以下代码抛出空指针异常。
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());
}
}
答案 0 :(得分:10)
问题是您的print语句被评估为:
System.out.println(("Result is: " + names) == null ? null : names.size());
这是因为+
has more precedence than ?:
operator因此,因为字符串 - “Result为null”不等于null
,所以评估names.size()
抛出NPE。
请注意,在字符串连接中使用null
时,它会自动转换为"null"
。因此,"Result is: " + null
不会抛出NPE
。这是按JLS - String Conversion:
如果引用为
null
,则将其转换为字符串"null"
(四个ASCII字符n,u,l,l)。
要解决此问题,您应该在条件表达式周围添加括号,以强制优先于它:
System.out.println("Result is: " + (names == null ? null : names.size()));
答案 1 :(得分:4)
更正了Jigar的答案,这实际上有效:
someString + null
要修复OP的代码,只需添加括号 - 这样操作将以正确的顺序执行,结果将符合预期:
System.out.println("Result is: " + (names == null ? null : names.size()));
答案 2 :(得分:2)
你正在写“结果是:”+名称,这不等于 null 所以它试图打印names.size()
。但是当调用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());
然后你将得到null作为输出。