この見苦しいコードはコンパイルされますが、次の場合に NPE がスローされます。s == null
public static boolean isNullOrEmpty(String s)
{
return s != null ? s.isEmpty() : null;
}
これはそうではありませんが(予想どおり):
public static boolean isNullOrEmpty(String s)
{
if(s != null)
return s.isEmpty();
else
return null;
}
どちらも明らかに間違っていることはわかっていますが、ソースで最初のコードを見つけたとき、それがコンパイルされたことに非常に驚きました。
編集: Java 7 の JLS の関連部分は次のとおりです。最初のステートメントが適用されると思いましたが、太字のステートメントが適用されます。
15.25 条件演算子 ? :
[...]
条件式のタイプは、次のように決定されます。
[...]
- 2 番目と 3 番目のオペランドの一方がプリミティブ型 T で、もう一方の型が T にボックス化変換 (§5.1.7) を適用した結果である場合、条件式の型は T です。
[...]
- それ以外の場合、2 番目と 3 番目のオペランドの型はそれぞれ S1 と S2 です。T1 を S1 にボックス化変換を適用した結果の型とし、T2 を S2 にボックス化変換を適用した結果の型とする。条件式の型は、キャプチャ変換 (§5.1.10) を lub(T1, T2) (§15.12.2.7) に適用した結果です。