繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM