为了账号安全,请及时绑定邮箱和手机立即绑定

在 CompletableFuture 的函数中抛出原始(内部)异常?

在 CompletableFuture 的函数中抛出原始(内部)异常?

青春有我 2021-11-11 13:31:37
我是 Java 新手,所以我希望这不是微不足道的,但我真的找不到我要找的东西。我有一个抛出异常的函数:public String foo(String s) throws MyException {    if ("a".equals(s)){      return s;    } else {      throw new MyException("Oh no!");    }}当 MyException 只是:class MyException extends Exception{  String str1;  MyException(String str2) {    str1=str2;  }  public String toString(){    return ("MyException Occurred: "+str1) ;  }}现在我有另一个在 CompletableFuture 中调用 foo 的方法:private CompletableFuture<String> test() throws Exception{        return CompletableFuture.supplyAsync(() -> foo("b"));}但是 foo 抛出异常,所以这里有一个编译错误,因为对 foo 的调用是未处理的异常。我想要的只是抛出原始(内部)异常。我怎样才能做到这一点?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

你有两个问题。

  1. 您不能在 lambda 表达式中抛出已检查的异常,请参见例如这个答案。要处理此问题,您可以在 lambda 表达式中使用 catch 块或使用运行时异常。

  2. supplyAsync(() -> foo("b"))意味着它将在稍后的某个时间在另一个线程中异步运行,例如当您调用.get()结果时。所以test()方法抛出异常是没有意义的。


查看完整回答
反对 回复 2021-11-11
?
12345678_0001

TA贡献1802条经验 获得超5个赞

该方法foo不得抛出已检查的异常,而是不可声明的 RuntimeException。


class MyException extends RuntimeException

创建 Future 已经不执行foo,将在另一个调用中执行。所以不能扔任何东西。


private static CompletableFuture<String> test() {

    return CompletableFuture.supplyAsync(() -> foo("b"));

}

可以通过超时get()或get超时等待完成。这将通过将其MyException包装为ExecutionException.


尝试 { 测试()。get();} catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.getCause().printStackTrace(); }


不要忘记拦截异常exceptionally:


try {

    String s = test().exceptionally(throwable -> {

       throwable.getCause().printStackTrace();

       return "xxx"; }).get();

    System.err.println("s=" + s);

} catch (InterruptedException e) {

    e.printStackTrace();

} catch (ExecutionException e) {

    e.printStackTrace();

}


查看完整回答
反对 回复 2021-11-11
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

您需要在 CompletableFuture 的实现中提供此已检查的 MyException 异常,因为它是“已检查的异常”,这意味着它是从 Exception 类派生的。要么为它提供服务,要么将 MyException 更改为从 RuntimeException 扩展,那么您就不需要提供它(捕获它)。


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 669 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信