Instantly share code, notes, and snippets.

Embed
What would you like to do?
Asynchronously handle exception and return a default or error value
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AsynchronousExceptionsHandlingWithExceptionally {
public static void main(final String[] args) throws InterruptedException, ExecutionException {
for (final boolean failure : new boolean[]{false, true}) {
CompletableFuture<Integer> x = CompletableFuture.supplyAsync(() -> {
if (failure) {
throw new RuntimeException("Oops, something went wrong");
}
return 42;
});
/**
* Returns a new CompletableFuture that is completed when this CompletableFuture completes,
* with the result of the given function of the exception triggering this CompletableFuture's completion
* when it completes exceptionally; otherwise, if this CompletableFuture completes normally,
* then the returned CompletableFuture also completes normally with the same value.
*/
CompletableFuture<Integer> tryX = x.exceptionally(ex -> -1); // Note that tryX and x are of same type.
// Blocks (avoid this in production code!), and either returns the promise's value
System.out.println(tryX.get());
System.out.println("isCompletedExceptionally = " + tryX.isCompletedExceptionally());
// Output[failure=false]: 42
// Output[failure=false]: isCompletedExceptionally = false
// Output[failure=true]: -1
// Output[failure=true]: isCompletedExceptionally = false
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment