Я нашел странное поведение в текущей версии Java 8. На мой взгляд, следующий код должен быть хорошо, но JVM бросает NullPointerException
:NullPointerException вместо нулевой (? JVM Bug)
Supplier<Object> s =() -> false ? false : false ? false : null;
s.get(); // expected: null, actual: NullPointerException
Это не имеет значения, какое именно лямбда-выражение оно (то же самое с java.util.function.Function
) или какие общие типы используются. Вместо false ? :
также могут быть более значимые выражения. Пример выше очень короткий. Вот более красочный пример:
Function<String, Boolean> f = s -> s.equals("0") ? false : s.equals("1") ? true : null;
f.apply("0"); // false
f.apply("1"); // true
f.apply("2"); // expected: null, actual: NullPointerException
Однако эти куски кода работать нормально:
Supplier<Object> s =() -> null;
s.get(); // null
и
Supplier<Object> s =() -> false ? false : null;
s.get(); // null
Или с функцией:
Function<String, Boolean> f = s -> {
if (s.equals("0")) return false;
else if (s.equals("1")) return true;
else return null;
};
f.apply("0"); // false
f.apply("1"); // true
f.apply("2"); // null
я тестировал с двумя Версии Java:
~# java -version
OpenJDK версия "1.8.0_66-внутренний" OpenJDK Runtime Environment (сборка 1.8.0_66-b01 внутренний) OpenJDK 64-разрядный сервер ВМ (сборка 25,66-b01, смешанный режим)
C:\>java -version
ява версия "1.8.0_51" Java (TM) SE Runtime Environment (строить 1.8.0_51-b16) Java HotSpot (TM) 64-разрядного сервера VM (сборка 25,51-B03, смешанный режим)
Как это отличается от 'Object a = false? false: false? false: null; 'который также дает« NullPointerException »? –
Это происходит в Java 7 и Java 8 (OpenJDK). –
@ bayou.io Как так? Лямбда ничего не добавляют. «Проблема» - это тернарные выражения. –