【问题标题】:Java not showing runtime errors/exceptions on async threadsJava 未在异步线程上显示运行时错误/异常
【发布时间】:2020-07-25 19:14:00
【问题描述】:

我有使用异步运行的 sql 查询

CompletableFuture.runAsync(() -> {
        readFromDB();
        parseJSON();
    });

并且没有出现错误/异常,我什至尝试抛出随机异常 (throw new EmptyStackException();),但它没有出现在控制台中,printf() 工作正常。

为什么没有显示错误/异常?

【问题讨论】:

  • “出现”是什么意思?你期望他们在哪里?
  • 控制台没有显示它们,代码执行停止但我没有收到任何错误。

标签: java multithreading asynchronous


【解决方案1】:

这是设计使然。要捕获/处理异常,需要一个同步点。通过调用CompletableFuture.runAsync(...),执行与当前线程显式分离,因此没有同步点。

可以做的是存储创建的CompletableFuture 并获取其状态,例如致电join():

final CompletableFuture<Void> future = CompletableFuture.runAsync(...);
...
try {
    future.join(); // This will re-throw the exception that occured in the future, if any
} catch (final RuntimeException e) { 
    e.printStackTrace();
}

【讨论】:

  • 谢谢,第一个解决方案对我有用,但我要保存这个以防我需要它。
【解决方案2】:

您可以使用 supplyAsync(()-> 来代替 runAsync 并处理类似以下的异常:

 supplyAsync(()-> {
         readFromDB();
         parseJSON();
    })
    .exceptionally(e-> {
         // your logic here
    });

【讨论】:

  • 谢谢,运行时错误和异常正在打印到控制台。
猜你喜欢
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多