fand ich ein seltsames Verhalten in der aktuellen Version von Java 8.em Meiner Meinung nach dem folgenden Code sollte in Ordnung sein, aber die JVM wirft ein NullPointerException
:Nullpointer statt Null (? JVM Bug)
Supplier<Object> s =() -> false ? false : false ? false : null;
s.get(); // expected: null, actual: NullPointerException
Es Es spielt keine Rolle, welche Art von Lambda-Ausdruck es ist (selbe mit java.util.function.Function
) oder welche generischen Typen verwendet werden. Anstelle von false ? :
können auch aussagekräftigere Ausdrücke verwendet werden. Das obige Beispiel ist sehr kurz. Hier ist ein buntes Beispiel:
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
jedoch diese Codestück gut laufen:
Supplier<Object> s =() -> null;
s.get(); // null
und
Supplier<Object> s =() -> false ? false : null;
s.get(); // null
Oder mit Funktion:
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
ich mit zwei getestet Java-Versionen:
~# java -version
openjdk Version "1.8.0_66-intern" OpenJDK Runtime Environment (build 1.8.0_66-internal-b01) OpenJDK 64-Bit Server VM (Build 25.66-b01, mixed mode)
C:\>java -version
java version "1.8.0_51" Java (TM) SE Runtime Environment (bauen 1.8.0_51-b16) Java HotSpot (TM) 64-Bit Server VM (Build 25.51-b03, mixed mode)
Wie unterscheidet sich das von "Objekt a = falsch? falsch: falsch? false: null; 'was auch eine' NullPointerException' ergibt? –
Es tritt in Java 7 und Java 8 (OpenJDK) auf. –
@ bayou.io Wie so? Lambdas fügen nichts hinzu. Das "Problem" sind ternäre Ausdrücke. –