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

时间:2013-09-05 05:14:19

标签: java operator-precedence

我想了解为什么以下代码抛出空指针异常

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

3 个答案:

答案 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作为输出。