Недавно я попытался запустить следующие два фрагмента кода и был удивлен результатом.
Первый:
// ...
System.out.println( (Boolean)null || true );
// ...
Второй:
// ...
System.out.println( (Boolean)null || false );
// ...
Первый пример приводит к следующему выводу:
true
Второй пример приводит к следующему выводу:
Исключение в потоке "main" java.lang.NullPointerException
в com.blah.main(SanityCheck.java:26)
Я бы подумал, что оба примера должны привести к исключению нулевого указателя, поскольку любое короткое замыкание применяется слева направо. Попытка распаковать логическое значение из логического значения должна была потерпеть неудачу до того, как будет рассмотрена другая сторона логики.
Кто-нибудь может объяснить это непоследовательное поведение?