这段丑陋的代码确实可以编译但是会抛出NPE s == null
public static boolean isNullOrEmpty(String s)
{
return s != null ? s.isEmpty() : null;
}
Run Code Online (Sandbox Code Playgroud)
虽然这不(如预期):
public static boolean isNullOrEmpty(String s)
{
if(s != null)
return s.isEmpty();
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
我知道它们都是明显错误的,但是当我在源代码中找到第一段代码时,我很惊讶它编译了.
编辑:这是Java 7中JLS的相关部分.我猜测第一个语句适用但粗体语句适用.
15.25条件运算符?:
[...]
条件表达式的类型确定如下:
[...]
[...]
ami*_*mit 16
第一个有一个trenary运算符,其结果类型为Boolean
.NPE正在将a转换null
为a boolean
.
它实际上是这样的:
Boolean temp = s != null ? s.isEmpty() : null; //no problems here
return temp; //crash when temp==null
Run Code Online (Sandbox Code Playgroud)
第二种是尝试返回错误的类型(Object而不是primitive) - 因此不会编译.