有没有办法让Runnable的runnable()抛出异常?

2022-08-31 11:36:15

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

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

问题是,通过用一个尝试/捕获来包围它,我使特定的run()变得毫无用处。我确实想抛出这个异常。

如果我为 run() 本身指定,编译器会抱怨 .throwsException is not compatible with throws clause in Runnable.run()

通常,我完全可以不让run()引发异常。但是我有独特的情况,我必须拥有这种功能。

如何解决此限制?


答案 1

您可以改用 a,将其提交到 a 并等待由 返回的结果。CallableExecutorServiceFutureTask.isDone()ExecutorService.submit()

当返回 true 时,您调用 。现在,如果您已经抛出了一个那么wiill也抛出一个,并且原始异常您将能够使用.isDone()FutureTask.get()CallableExceptionFutureTask.get()ExceptionException.getCause()


答案 2

如果你想将一个实现到框架中的类传递到框架中,那么你必须遵守该框架的规则,请参阅Ernest Friedman-Hill的答案,为什么这样做是一个坏主意。RunnableThread

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

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

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

您甚至可以创建一个适配器,将此接口转换为适合在线程框架中使用的 real (通过处理已检查的异常 )。Runnable


推荐