2013-03-07 21 views
3

我有一個簡單的界面傳播從一個泛型方法的異常沒有拋出聲明

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 thrownthrow e;指向。

我不明白爲什麼這不起作用。正如預期的那樣,進一步將電話打到apply沒有任何新意。

我的問題是:

  1. 爲什麼不這項工作?
  2. 我該如何解決?

我相信一個解決方法是讓我的接口接受一個異常類型。我不確定這個語法是否可行,但我想我可以沿着

public interface FuncEx<I, O, E> { 
    public O apply(I i) throws E; 
} 

這樣的行做些事情有沒有更好的方法?我不認爲我必須創建一個全新的界面來加強這一點。

回答

4

檢查異常(即異常不是RuntimeException的子類 - 例如JSONException)構成方法簽名的一部分。如果你調用一個拋出檢查異常的方法,你必須處理它,或者聲明你自己拋出它。如果你自己拋出一個檢查過的異常(就像你使用catch/rethrow代碼一樣),你仍然必須聲明它。

如果你不想聲明你拋出它,那麼你可以將它包裝在一個RuntimeException中。例如:

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 new RuntimeException("Could not get bar", e); 
    } 
    } 
} 

有關何時拋出checked異常而不是RuntimeExceptions的想法很多而且各不相同。對我來說,我的第一個指導原則是,如果你可以合理地期望調用者以有意義的方式迴應異常(不只是重新拋出它),那麼將它作爲檢查異常。否則,使其成爲RuntimeException。

這是一篇關於該主題的優秀文章:http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

+0

優秀的文章,感謝分享。 – arin 2013-03-07 15:27:22

相關問題