Недавно я попытался выполнить следующие два фрагмента кода и был удивлен выходом.Как работает распаковка в коротких замыканиях булевых выражений?
Первое:
// ...
System.out.println((Boolean)null || true);
// ...
Второе:
// ...
System.out.println((Boolean)null || false);
// ...
Первый пример приводит следующий вывод:
истинные
Второй пример приводит следующий вывод:
Исключение в теме "main" jav a.lang.NullPointerException
в com.blah.main (SanityCheck.java:26)
Я бы подумал, оба примера следует привести исключения нулевого указателя, так как применяется любое короткое замыкание лево- направо. Попытка уничтожить логическое значение из булева должна была провалиться перед другой стороной логического или была рассмотрена.
Может ли кто-нибудь объяснить это непоследовательное поведение?
Это поведение выглядит несовместимым с [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.24) «Во время выполнения слева -ограниченное выражение операнда сначала оценивается, если результат имеет тип Boolean, он подвергается распаковке преобразования « –
SanityCheck.java – arynaq