Этот уродливый кусок кода компилируется, но выдает 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;
}
Я знаю, что оба они явно ошибаются, но поскольку я нашел первый фрагмент кода в наших источниках, я был очень удивлен, что он скомпилировался.
Изменить: Здесь соответствующая часть JLS из Java 7. Я догадался, что будет применяться первый оператор, но полужирный.
15.25 Условный оператор?:
[...]
Тип условного выражения определяется следующим образом:
[...]
- Если один из второго и третьего операндов имеет примитивный тип T, а тип другого - результат применения преобразования бокса (п. 5.1.7) в T, то тип условного выражения T.
[...]
- В противном случае второй и третий операнды имеют типы S1 и S2 соответственно. Позволять T1 - тип, который возникает в результате применения преобразования бокса в S1, и пусть T2 тип, который возникает в результате применения преобразования бокса в S2. Тип условного выражения является результатом применения захвата преобразование (§5.1.10) в lub (T1, T2) (§15.12.2.7).