我正在尝试初始化Runnable的数组,然后运行其代码。我需要初始化尽可能地易读,因此我为此使用了Lambda表达式。现在,我不知道如何解决异常问题。如果Runnables内部的某些代码引发了已检查的异常,我想将其自动包装到RuntimeException中,而不要将try / catch逻辑放入每个Runnable主体中。
代码如下:
public void addRunnable(Runnable ... x); // adds a number of Runnables into an array
...
addRunnable(
()->{
some code;
callMethodThrowsException(); // this throws e.g. IOException
},
()->{
other code;
}
// ... and possibly more Runnables here
);
public void RunnableCaller(List<Runnable> runnables) {
// Now I want to execute the Runnables added to the array above
// The array gets passed as the input argument "runnables" here
for(Runnable x: runnables) {
try {
x.run();
} catch(Exception e) { do some exception handling }
}
}
该代码无法编译,因为callMethodThrowsException引发了一个已检查的异常,而Runnable则没有,因此我必须插入Runnable定义的try / catch块INSIDE。 try / catch块会使事情变得不那么方便了,因为我将不得不将其放入每个Runnable主体声明中,这将很难阅读且难以编写。另外,我可以创建自己的引发异常的Runnable类,但随后我不能使用Lambda表达式()->来使其简短易读,而不是
new ThrowingRunnable() { public void run() throws Exception { some code; } }
有没有一种方法来定义自己的功能接口来解决此问题,因此我可以使用相同的代码,但是异常将被包装到例如RuntimeExceptions左右?我对调用代码有完全的控制权,因此捕获那里的异常是没有问题的,我只需要一种可读性强的编写代码的方式,以后即可执行。
我看到了这个主题Java 8 Lambda function that throws exception?,但是我并没有弄清楚如何解决我的问题,我对功能接口不是很熟悉。可能有人可以帮忙,谢谢。
答案 0 :(得分:1)
Lambda不仅适用于JVM提供的接口。它们可用于精确定义一个且只有一个抽象方法的每个接口。这样您就可以自己创建一个接口,您已经对其进行了命名:
public interface ThrowingRunnable{
void run() throws Exception;
}
然后在addRunnable
方法中替换参数类型:
public void addRunnable(ThrowingRunnable... runnables){ ... }
然后让它进行编译:
addRunnable(
()->{
some code;
callMethodThrowsException(); // this throws e.g. IOException
},
()->{
other code;
}
// ... and possibly more Runnables here
);