5

I want to understand why the following code throws Null pointer exception.

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

3 回答 3

10

问题是您的打印语句被评估为:

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()));
于 2013-09-05T05:22:36.900 回答
4

纠正 Jigar 的回答,这实际上有效

someString + null

要修复 OP 的代码,只需添加括号 - 这样操作将以正确的顺序执行,结果将符合预期:

System.out.println("Result is: " + (names == null ? null : names.size()));
于 2013-09-05T05:21:44.720 回答
2

你正在写"Result is:" + names这不等于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 作为输出。

于 2013-09-05T05:27:22.940 回答