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

我是 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 的调用是未处理的异常。


我想要的只是抛出原始(内部)异常。我怎样才能做到这一点?


青春有我
浏览 670回答 3
3回答

隔江千里

你有两个问题。您不能在 lambda 表达式中抛出已检查的异常,请参见例如这个答案。要处理此问题,您可以在 lambda 表达式中使用 catch 块或使用运行时异常。这supplyAsync(() -> foo("b"))意味着它将在稍后的某个时间在另一个线程中异步运行,例如当您调用.get()结果时。所以test()方法抛出异常是没有意义的。

12345678_0001

该方法foo不得抛出已检查的异常,而是不可声明的 RuntimeException。class MyException extends RuntimeException创建 Future 已经不执行foo,将在另一个调用中执行。所以不能扔任何东西。private static CompletableFuture<String> test() {&nbsp; &nbsp; return CompletableFuture.supplyAsync(() -> foo("b"));}可以通过超时get()或get超时等待完成。这将通过将其MyException包装为ExecutionException.尝试 { 测试()。get();} catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.getCause().printStackTrace(); }不要忘记拦截异常exceptionally:try {&nbsp; &nbsp; String s = test().exceptionally(throwable -> {&nbsp; &nbsp; &nbsp; &nbsp;throwable.getCause().printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp;return "xxx"; }).get();&nbsp; &nbsp; System.err.println("s=" + s);} catch (InterruptedException e) {&nbsp; &nbsp; e.printStackTrace();} catch (ExecutionException e) {&nbsp; &nbsp; e.printStackTrace();}

慕哥9229398

您需要在 CompletableFuture 的实现中提供此已检查的 MyException 异常,因为它是“已检查的异常”,这意味着它是从 Exception 类派生的。要么为它提供服务,要么将 MyException 更改为从 RuntimeException 扩展,那么您就不需要提供它(捕获它)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java