我有一个简单的界面
public interface Func<I, O> {
public O apply(I i);
}
我有一个带有一堆私有(静态)类的类,它们像这样实现该接口
import org.json.*;
public static class Baz {
public static B Qux(String jsonSource) throws JSONException {
JSONObject m = new JSONObject(jsonSource);
return new Baz.Foo().apply(m);
}
private static class Foo implements Func<JSONObject, B> {
public B apply(JSONObject f) {
JSONObject x = f.getJSONObject("bar");
/* Whatever other code in here */
return new B(); /* Place-holder */
}
}
}
由于几乎所有对 JSONObjects 的操作都需要JSONException
被捕获,因此编译器会在JSONObject x = f.getJSONObject("bar");
. 考虑到我可以简单地将该特定应用包装起来try-catch
并将异常重新抛出给调用者,我尝试了它,如下所示:
private static class Foo implements Func<JSONObject, B> {
public B apply(JSONObject f) {
try {
JSONObject x = f.getJSONObject("bar");
/* Whatever other code in here */
return new B(); /* Place-holder */
catch (JSONException e) {
throw e;
}
}
}
然而,有了这个,我现在开始error: unreported exception JSONException; must be caught or declared to be thrown
指向throw e;
.
我不明白为什么这不起作用。apply
正如预期的那样,进一步包装调用并没有做任何新的事情。
我的问题是:
- 为什么这不起作用?
- 我该如何解决?
我相信解决方法是让我的界面接受异常类型。我不确定这种语法是否有效,但我想我可以按照以下方式做一些事情
public interface FuncEx<I, O, E> {
public O apply(I i) throws E;
}
有更好的方式吗?我不认为我必须创建一个全新的界面来解决这个问题。