我想要的是一个标准的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块加载。
最终编辑看起来我正在寻找的东西不存在。接受的答案是最接近“正确”的答案,但看起来没有解决方案可以回答问题。
答案 0 :(得分:5)
你能使用Callable<Void>
吗?
答案 1 :(得分:2)
只有一个方法的界面,返回void
并抛出Exception
。
在所有java
和javax
类中,只有一个符合该描述:
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);
}