2016-08-08 6 views
2

Ich erhalte eine andere Ausgabe aus dem gleichen Code-Snippet unter verschiedenen Nebenversion von Java. Ich konnte das zugehörige Ticket auf dem offenen jdk bug tracker nicht finden.Verschiedene Nachrichten für CompletionException unter verschiedenen Nebenversionen von Java 8

CompletableFuture<String> completableFuture = new CompletableFuture<>(); 
completableFuture.complete("xxx"); 

completableFuture.thenCompose(str -> { 
    CompletableFuture<String> completableFuture1 = new CompletableFuture<>(); 
    completableFuture1.completeExceptionally(new Exception("hello")); 
    return completableFuture1; 
}).exceptionally(ex -> { 
    System.out.println(ex.getMessage()); 
    return null; 
}).get(); 

Output unter JDK 1.8.0_25:

Hallo

Output unter JDK 1.8.0_102:

java.lang.Exception: Hallo

Ist der neuere ein Fix oder eine Regression? Was ist das zugehörige Ticket?

+0

Ist nicht die Ausnahmebedingung nur für Menschen da? Alle notwendigen weiteren Werte sollten in der Exception selbst enthalten sein. – Robert

Antwort

5

Es gibt einen Fehlerbericht here über diese Änderung. Der Schlüssel liegt in der Javadoc von CompletableFuture#thenCompose

Gibt ein neue CompletionStage, die, wenn diese Stufe normalerweise abgeschlossen, mit dieser Phase als Argument für die mitgelieferte Funktion ausgeführt wird. Die Dokumentation CompletionStage für Regeln, die abdecken, ist außergewöhnlich.

und und Klassen Dokumentation von CompletionStage

In allen anderen Fällen, wenn eine Berechnung der Stufe abrupt mit endet eine (nicht markiert) Ausnahme oder Fehler, dann alle abhängigen Stufen erfordern seine Fertigstellung vollständige außerordentlich ebenso, mit einem CompletionException Halten der Ausnahme als seine Ursache.

Das sehen Sie hier. Die Function, die Sie an exceptionally übergeben, empfängt jetzt eine CompletionException, die die Exception hält, die die auslösende CompletableFuture abgeschlossen hat.

Das Verhalten, das Sie jetzt sehen, ist das erwartete Verhalten.

Sie verlassen nun die Ursache des außergewöhnlichen Abschlusses

Throwable cause = ex.getCause(); // this is your Exception("Hello") 
0

Dies ist ein Problem auspacken müssen zu erhalten und wurde in 9 und zurückportiert zu 8u60 bereits fixiert. Sie werden java.lang.Exception: Hallo ab 8u60 sehen.

Verwandte Themen