ho trovato uno strano comportamento nella versione corrente di Java 8. A mio parere il seguente codice dovrebbe andare bene, ma la JVM lancia una NullPointerException
:NullPointerException invece di null (? JVM Bug)
Supplier<Object> s =() -> false ? false : false ? false : null;
s.get(); // expected: null, actual: NullPointerException
E ' non importa, che tipo di espressione lambda è (uguale a java.util.function.Function
) o quali tipi generici vengono utilizzati. Ci possono anche essere espressioni più significative al posto di false ? :
. L'esempio sopra è molto breve. Ecco un esempio più colorata:
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
Tuttavia questi pezzi di codice funzionano bene:
Supplier<Object> s =() -> null;
s.get(); // null
e
Supplier<Object> s =() -> false ? false : null;
s.get(); // null
oppure con funzione di:
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
ho provato con due Versioni Java:
~# java -version
versione openjdk "1.8.0_66-interno" OpenJDK Runtime Environment (build 1.8.0_66-b01 interna) OpenJDK a 64 bit di server VM (build 25.66-b01, modalità mista)
C:\>java -version
versione java "1.8.0_51" Java (TM) SE Runtime Environment (costruire 1.8.0_51-b16) Java HotSpot (TM) a 64 bit di server VM (build 25.51-B03, modalità mista)
Com'è diverso da 'Oggetto a = falso? falso: falso? false: null; 'che produce anche un' NullPointerException'? –
Si verifica in Java 7 e Java 8 (OpenJDK). –
@ bayou.io In che modo? Lambda non aggiunge nulla. Il "problema" è espressioni ternarie. –