Kow*_*ser 2 java ternary-operator nullpointerexception
这条线是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
}
}
Run Code Online (Sandbox Code Playgroud)
pFile不是null; File你可以看到a 被实例化.但显然文件不存在.问题不在于此pFile.我对运营商的处理方式感兴趣null.
你的代码相当于:
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;
}
Run Code Online (Sandbox Code Playgroud)
换句话说,Boolean在这种情况下,条件运算符的类型,然后该值被取消装箱以返回a boolean.何时null取消装箱,您将获得例外.
从Java语言规范的15.25节:
否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.
我相信这是适用的情况,虽然我会认为它不是那么清楚.