当前位置: 首页 > 知识库问答 >
问题:

Runnable未捕获异常

梁韬
2023-03-14

我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常?

Runnable r = () -> {
    try {
        job.print(); 
    } catch (Exception e) {
        e.printStackTrace();
    }
};

if (job.printDialog()) {
    Thread t = new Thread(r);
    r.start();
}

阅读有没有一种方法可以使Runnable的run()引发异常,我收集到:

  1. "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson)
  2. 我应该检查Runnable.run()方法中的异常。

为什么会这样?对此问题的任何“简单”解释都将受到高度赞赏!

共有2个答案

慎望
2023-03-14

您可以从逻辑和编程的角度来回答这个问题。让我们从逻辑上开始:

您可以将线程视为“代码的独立执行器”,它完全独立于其他代码执行器,共享内存除外。您必须传递线程初始化的Runnable“包装”线程必须执行的代码。由于没有“更高实例”可以捕获异常,因此在这些Runnables中抛出异常没有太大意义。

现在是编程的观点。以下代码片段类似于Java SE中定义接口的方式:

@FunctionalInterface
interface Runnable {
    void run();
}

由于函数run()不会引发任何已检查的异常,因此不允许在run()中引发已检查的异常。由于Runnable是专为线程初始化而设计的,因此这非常有意义<然而,code>Callable包含一个throws子句,因为它们主要用于执行器,执行器确实能够处理异常。

盛承
2023-03-14

正如您已经发现的那样,在Runnable运行状态之外没有捕获任何东西。语言规范不断变化。今天可能有解释的东西明天可能会有其他东西。您可能会在为什么不能运行()Runnable抛出检查异常?中找到答案,特别是为什么添加Callable来捕获Future的结果。

 类似资料:
  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。

  • Twilio新手使用测试帐户。我按照这里列出的安装Twilio PHP的说明进行了安装:https://www.Twilio.com/docs/quickstart/php/sms 因为我得到了一个证书错误,所以我的主机提供程序建议我更改CURLOPT_SSL_VERIFYPEER=>false(从true改为true)。但现在我得到了这个错误。如何修复?:致命错误:未捕获异常“services_

  • @ControllerAdvice类是RestResponseEntityExceptionHandler.java。 我被告知,默认情况下spring boot应该返回如下所示的内容 我给它的不存在的路径是 我的控制器类是Breweries_Controller

  • 我在我们的一个开发环境中得到了以下异常。但是它在另一个环境中工作得很好。无法抓住窍门。有人能帮忙吗?