下面是我正在使用的示例代码,用于理解在java8中的Cometable前途中的异常处理。如果我们按照doc使用异常方法,异常方法也会捕获甚至运行时异常,并继续到管道中的最后一个块。
如果我们不使用特殊的方法,那么它只是打印运行和退出。
如果我的理解不正确,就纠正我。
问题是,如果我想抛出运行时异常并希望应用程序停止,那么就可以这样说。基本上,如果我抛出运行时异常,它就不应该继续到管道中的下一个块。我该怎么做。任何指示都是有帮助的。
public static void main(String[] args) {
final CompletableFuture<String> retrieveName = CompletableFuture.supplyAsync(() -> {
System.out.println("running");
int i = 0;
if(i == 0) {
throw new RuntimeException("ding");
}
return "test";
}).exceptionally(it -> {
System.out.println(it.getMessage());
return "empty";
}).thenApply(it -> {
System.out.println("last block" + it);
return "dummy";
});
}发布于 2018-02-03 05:48:21
试试这个:
public static void main(String[] args) {
try {
final CompletableFuture<String> retrieveName = CompletableFuture.supplyAsync(() -> {
System.out.println("running");
int i = 0;
if (i == 0) {
throw new RuntimeException("ding");
}
return "test";
}).exceptionally(it -> {
if (it.getMessage().contains("ding")) {
throw (RuntimeException) it;
}
System.out.println(it.getMessage());
return "empty";
}).thenApply(it -> {
System.out.println("last block" + it);
return "dummy";
});
retrieveName.join();
} catch (Exception e) {
System.out.println("main() exception, cause=" + e.getCause());
}
}这是输出:
正在运行 main()异常,cause=java.lang.RuntimeException: ding
我对您的代码做了3个小更改:
公共T加入() 返回完成后的结果值,否则将抛出(未检查)异常(如果已完成异常)。
基于OP反馈的更新->
假设我想抛出运行时异常并希望应用程序停止。基本上,如果我抛出运行时异常,它就不应该继续到管道中的下一个块。我该怎么做。
只要对代码进行2次更改,就可以实现您想要的结果:
1完全删除exceptionally()回调,以便CompletableFuture (CF)以异常终止。在OP代码中的exceptionally()中,异常被吞没而不是重新抛出,并返回一个CF,因此仍然执行thenApply()方法。
2在main()末尾添加对retrieveName.join()的调用。这是一个阻塞调用,但是由于线程以一个与示例代码不相关的异常结束,所以join()方法将提取抛出的CompletionException.并重新抛出它,并将其包装在一个CompletionException.中。
以下是您修改的代码:
public static void main(String[] args) {
final CompletableFuture<String> retrieveName = CompletableFuture.supplyAsync(() -> {
System.out.println("running");
int i = 0;
if(i == 0) {
throw new RuntimeException("ding");
}
return "test";
}).thenApply(it -> {
System.out.println("last block" + it);
return "dummy";
});
retrieveName.join();
}备注:
https://stackoverflow.com/questions/48152551
复制相似问题