2012-09-08 86 views
2

我試圖定義異常類的列表,像這樣:定義異常類的列表 - 類型不匹配錯誤

private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class); 

錯誤,我從Eclipse中得到的是這樣的:

Type mismatch: cannot convert from List<Class<? extends RuntimeException>> to List<Class<? extends Exception>> 

莫非你請指教?我不明白爲什麼它不能例外列表轉換到例外列表...

回答

2

+1 for Reimeus's answer。但是,如果您希望保留使用列表中的父Exception類型中聲明,這是我能想出(使用Java 7語法)最好的:

private static final List<Class<? extends Exception>> SOME_ERRORS = new ArrayList<>(); 
static{ 
    SOME_ERRORS.add(NumberFormatException.class); 
    SOME_ERRORS.add(NullPointerException.class); 
} 

你的問題是由於Arrays.asList自動確定適合你的列表類型。爲了比較,這也是工作沒有錯誤:

private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class, Exception.class); 

特別處理「常量」(static final S),你平時最好建議,以確保這些陣列/集不能被修改。在最壞的情況下,這可以節省運行到一些困難的問題。例如:

private static final List<Class<? extends Exception>> SOME_ERRORS; 
static{ 
    List<Class< ? extends Exception>> errors = new ArrayList<>(); 
    errors.add(NumberFormatException.class); 
    errors.add(NullPointerException.class); 

    SOME_ERRORS = Collections.unmodifiableList(errors); 
} 
+0

這讓我感到驚訝。只要我添加了編譯的FileNotFoundException.class代碼。我仍然覺得很奇怪,但我想我現在明白爲什麼它是這樣的。謝謝 –

+0

接受你對這條信息的回答「你的問題是由於Arrays.asList自動爲你確定正確的列表類型。」 –

2

你應該使用:

List<Class<? extends RuntimeException>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class); 

Arrays.asList返回的泛型類型總是會使用最具體的類型,即RuntimeException。如果您向列表中添加了經過檢查的例外情況,此聲明將變爲:

List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(IOException.class, NumberFormatException.class, NullPointerException.class); 
+0

但是,不要運行時異常擴展異常嗎?我清楚地想要擴展Exception類的任何異常類的列表。如果我將一個非運行時異常添加到列表中怎麼辦? –

+0

回答我自己的問題,添加一個非運行時異常到列表工作正常,突然編譯。 –

+0

要回答你的問題,請參閱我的更新 – Reimeus