是否有一个标准的JDK接口,像void run()这样的方法抛出异常?

时间:2011-07-15 06:25:44

标签: java

我想要的是一个标准的JDK类,如下所示:

interface ExplodingRunnable {
    void run() throws Exception;
}

Callable不合适,因为需要call()方法才能返回值,但我需要void

Runnable不合适,因为其run()方法未声明throws Exception

我需要将两者结合起来。有什么想法吗?

编辑:我应该提到我尝试了Callable<Void>,但它要求您定义一个方法:

public Void call() {
    // run your code;
    return null; // ugly!
}

我正在寻找更好的东西。

为什么我要这个?

我正在实现标准为什么捕获“永远不会发生”异常(它们永远不会发生,但各种API定义它们抛出异常的方法)并通过包装它们来抛出可能发生的任何异常在(未经检查的)RuntimeException中,所以调用者可以简单地传递一个“ExplodingRunnable”,而不必编写永远不会被执行的敷衍的try / catch块加载。

最终编辑看起来我正在寻找的东西不存在。接受的答案是最接近“正确”的答案,但看起来没有解决方案可以回答问题。

5 个答案:

答案 0 :(得分:5)

你能使用Callable<Void>吗?

答案 1 :(得分:2)

只有一个方法的界面,返回void并抛出Exception

在所有javajavax类中,只有一个符合该描述:

package java.lang;

public interface AutoCloseable
{
    void close() throws Exception;
}

嗯......“关闭”这个词有很多含义......


你希望用一些额外的处理来包围一堆语句,这里定义你自己的接口是没有罪的。您可能会发现您的API要求用户学习4个新短语

Util.muckException( new ExplodingRunnable() { public void run() throws Exception
 ^1     ^2                  ^3                             ^4

你实际上可以减少两个,用户代码看起来像这样

new MuckException(){ public void run() throws Exception
{
    statement_1;
    ...
    statement_n;
}};

public abstract class MuckException
{
    public abstract run() throws Exception;

    public MuckException()
    {
        try{ run(); }
        catch(Exception e){ throw new Error(e); }
    }
}

答案 2 :(得分:0)

只需使用Callable,忽略返回值并将文档记录为忽略返回值并建议返回null。仅仅因为可以返回某些内容并不意味着你拥有

答案 3 :(得分:0)

我会使用Callable<Void>并学会喜欢它。 ;)

您可以使用以下内容声明未检查的异常。

Runnable runs = new Runnable() {
    public void run() {
        try {
            // do something
        } catch(Exception e) {
            // rethrows anything without the compiler knowing.
            // the method is deprecated but can be used on the current thread.
            Thread.currentThread().stop(e);
        }
    }
});

Future future = executorService.submit(run);
try {
   future.get();
} catch (ExecutionException ee) {
    Throwable e = ee.getCause(); // can be the checked exception above.
}

答案 4 :(得分:0)

  

并且不必编写永远不会被执行的敷衍的try / catch块。

我遇到了同样的问题并且修改了一点点

// Exceptions class
public RuntimeException wrap(Exception e) {
   return e instanceof RuntimeException ? ((RuntimeException)e) : new RuntimeException(e);
}

// user code
try {
  foo.bar();
} catch (Exception e) {
 throw Exceptions.wrap(e);
}