私はシンプルなインターフェースを持っています
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;
}
A BetterWay™はありますか?この小さな問題に取り組むためだけに、まったく新しいインターフェイスを作成する必要があるとは思いません。