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

有没有办法使Runnable的run()引发异常?

毋琪
2023-03-14

我在实现Runnable的类的run()中调用的方法被设计为引发异常

但是Java编译器不允许我这样做,建议我用try/catch来围绕它。

问题是,通过使用try/catch将其包围,我使特定的run()变得无用。我确实想抛出该异常。

如果我为run()本身指定了throws,编译器会抱怨异常与Runnable中的throws子句不兼容。run()。

通常情况下,我完全可以不让run()抛出异常。但是我有独特的情况,在这种情况下我必须具有该功能。

如何绕过此限制?

共有3个答案

阎烨
2023-03-14

如果run()引发了一个选中的异常,那么什么会捕获它?您无法将该调用包含在处理程序中,因为您没有编写调用它的代码。

您可以在run()方法中捕获已检查的异常,并在其位置抛出未检查的异常(即RuntimeException)。这将使用堆栈跟踪终止线程;也许这就是您想要的。

如果您希望您的run()方法在某处报告错误,那么您可以只为run()方法的catch块提供一个回调方法来调用;该方法可以将异常对象存储在某个位置,然后您感兴趣的线程可以在该位置找到该对象。

洪子晋
2023-03-14

如果您想将实现可运行的类传递到线程框架中,那么您必须遵守该框架的规则,请参阅Ernest Friedman Hill的答案,否则为什么这样做是个坏主意。

不过,我有一种预感,您希望直接在代码中调用run方法,以便您的调用代码可以处理异常。

这个问题的答案很简单。不要使用线程库中的可运行接口,而是使用修改后的签名创建自己的接口,允许抛出选中的异常,例如。

public interface MyRunnable
{
    void myRun ( ) throws MyException;
}

您甚至可以创建一个适配器,将此接口转换为真正的可运行接口(通过处理选中的异常),以适合在线程框架中使用。

余弘新
2023-03-14

您可以改为使用可调用的,将其提交给ExecutorService,并使用FutureTask等待结果。isDone()由ExecutorService返回。提交()。

isDone()返回true时,调用FutureTask。get()。现在,如果您的可调用的抛出了一个异常,那么FutureTask。get()也将引发异常,并且可以使用异常访问原始异常。getCause()。

 类似资料:
  • 问题内容: 我在实现Runnable的类中的run()中调用的方法被设计为引发异常。 但是Java编译器不允许我这样做,建议我用try / catch包围它。 问题是,通过用try / catch包围它,我使 特定的 run()无效了。我 确实 想抛出该异常。 如果我指定的run()的本身,编译器会抱怨说。 通常,我对run()不会抛出异常完全满意 。但是,在我必须具有该功能的特殊情况下。 如何解

  • 问题内容: 我有一个使用处理程序发布可运行实例的线程。它工作得很好,但是我很好奇我如何将参数传递给Runnable实例使用?也许我只是不了解此功能的工作原理。 为了避免出现“您为什么需要此问题”的问题,我有一个线程化的动画,必须调出UI线程来告诉它实际绘制的内容。 问题答案: 只需使用接受参数的构造函数实现的类就可以了, 您可以使用参数化构造函数创建Runnable类的实例。

  • 背景: 所以我有一个方法调用,我想保存到一个文本文件中。这样做的目的是将可运行的序列化对象保存到文本文件中,并在以后从文本文件中获取要执行的对象。 错误是: 我理解错误,Runnable是一个接口,它不能被序列化。然而,我还能做些什么来解决我的问题吗? 解决方案尝试1。错误

  • 问题内容: 我有一个UpdateProgress控件,该控件显示为更新面板的所有异步事件的覆盖图(使用CSS)。现在,对于某些EXPAND / COLLAPSE行命令事件,我只是不想显示该updateprogress。 有办法吗? 问题答案:

  • 问题内容: 我想知道是否有可能以编程方式发现特定API的所有端点。 因此,例如,如果我使用浏览器或curl获取此URL:https : //api.twitter.com/1.1/ 我可能会收到类似以下内容的JSON响应: 当然,Twitter可以选择发布还是不发布这种格式。因此,作为一个附带问题,是否有任何Java或Java库可以自动映射和发布您在控制器中创建的API路由? 问题答案: 由于没有

  • 问题内容: 请考虑以下表格: 部 员工 编写查询以返回人员总数为4或更多的那些部门的雇员的empname和deptname列。记录应按姓氏的字母顺序返回 这是我的看法: 您将如何对此进行改进? 问题答案: 这比较短,而且执行速度可能也更快 从分组开始。您不需要内部查询中的COUNT。然后,联接两个表只是为了获得名称。 *之所以使用 *INNER JOIN, 是因为一旦计数完成,我们已经知道 员工存