Meine Intuition ist, dass der folgende Code falsch ist. Ich glaube, da join() verwendet wird, werden alle Ausnahmen, die während der Fertigstellung der Futures geworfen werden, deaktiviert. Wenn dann get() aufgerufen wird, gibt es keine geprüften Ausnahmen, keine Protokollierung von Fehlern und Schwierigkeiten beim Diagnostizieren von Fehlern während eines Fehlers.CompleteFuture Ausnahmeverhalten mit Join() dann get()
List<CompletableFuture> list = ImmutableList.of(future1, future2);
CompletableFuture.allOf(list.toArray(new CompletableFuture[list.size()])).join();
try {
result1 = future1.get();
result2 = future2.get();
} catch (InterruptedException | ExecutionException e) {
// will this ever run if join() is already called?
}
Ich habe die Dokumentation für CompletableFuture durchgesehen, aber habe nicht die genaue Antwort auf meine Frage gefunden. Ich frage hier und werde dann den Quellcode durchlesen. Der einzige Grund, warum ich sehen kann, dass der catch-Block-Code ausgeführt wird, ist, wenn irgendwie überprüfte Ausnahmen in einem Ausführungskontext gespeichert und nicht in join() geworfen (oder durch eine ungeprüfte Ausnahme umbrochen) geworfen werden und dann erneut geworfen werden in irgendeiner Form nach get(). Das erscheint mir unwahrscheinlich.
Also meine ultimative Frage ist, wird der Catch-Block-Code jemals ausgeführt werden?
warum nicht einfach direkt verwenden: 'CompletableFuture.allOf (neue CompletableFuture [] {future1, future2}). Join();' – Lino
@Lino Klar, das klingt viel einfacher. Arbeiten an einer gemeinsamen Codebasis und das ist nicht mein Code. – user3527174
herausgefunden, dass es noch einfacher sein kann: verwenden Sie einfach 'CompletableFuture.allOf (future1, future2) .join();' – Lino