为什么在这种情况下为原始函数返回null?

ata*_*man 18 java jls

这段丑陋的代码确实可以编译但是会抛出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条件运算符?:

[...]

条件表达式的类型确定如下:

[...]

  • 如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么条件表达式的类型是T.

[...]

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

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) - 因此不会编译.