有问题的行是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
感兴趣。
答案 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