亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 717 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號