需要解释:java中的三元运算符

时间:2011-09-19 05:06:20

标签: java nullpointerexception ternary-operator

有问题的行是return pFile.exists() ? true : null;。因为它没有引起任何编译错误,对此有什么解释。它最终提高了NPE

import java.io.File;
public class Main {
  public static void main(String... args) {
    boolean accept = accept(new File(""));
    System.out.println("accept = " + accept);
  }
  public static boolean accept(File pFile) {
    System.out.println(pFile.exists()); // prints: false, so pFile is not null
    return pFile.exists() ? true : null; //this line should throw compilation error
  }
}

pFile不是null;如您所见,File被实例化。但显然文件不存在。问题不在于pFile。我对运营商如何处理null感兴趣。

3 个答案:

答案 0 :(得分:7)

您的代码相当于:

public static boolean accept(File pFile) {
    System.out.println(pFile.exists()); // prints: false, so pFile is not null
    Boolean tmp = pFile.exists() ? true : null;
    return (boolean) tmp;
}

换句话说,在这种情况下,条件运算符的类型为Boolean,然后该值将被取消装箱以返回boolean。取消装箱null后,您会收到例外情况。

来自Java语言规范的section 15.25

  

否则,第二和第三操作数分别为S1和S2类型。设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果。

我相信这是适用的情况,虽然我会认为它不是那么清楚。

答案 1 :(得分:2)

从定义为返回Boolean null的函数返回boolean(基本类型;注意小b)。 null值会自动取消装箱,并且会产生NPE。

答案 2 :(得分:-1)

实际上,正在使用空字符串来创建file。这会导致空abstract pathname,没有前缀(或目录)和空名称序列。因此,Windows无法创建file。这反过来又抛出NPE