我有兩個類從java.lang.Exception
繼承。他們都有一個相同的簽名void a(){...}
的方法。它們都可以被引入代碼塊中。如果我做的:多重例外捕獲中的未定義方法
catch (SubException1 | SubException2 e)
{
e.a();
}
然後,它不能編譯,因爲方法a()
不屬於異常。這是Java語言缺陷嗎?我應該如何正確設計我的代碼以防止代碼冗餘?
我有兩個類從java.lang.Exception
繼承。他們都有一個相同的簽名void a(){...}
的方法。它們都可以被引入代碼塊中。如果我做的:多重例外捕獲中的未定義方法
catch (SubException1 | SubException2 e)
{
e.a();
}
然後,它不能編譯,因爲方法a()
不屬於異常。這是Java語言缺陷嗎?我應該如何正確設計我的代碼以防止代碼冗餘?
當您在單個catch語句中捕獲多個異常類型時,捕獲異常的推斷類型是這些類的最大公分母。在你的情況下,最大的共同點是Exception
,它沒有方法void a()
。爲了使其catch塊,你既可以將其解壓縮到一個共同的基類,或(可以說)更優雅,在這兩個類實現的接口定義可訪問:
public interface SomeExceptionInterface {
void a();
}
public class SomeException extends Exception implements SomeExceptionInterface {
// Implementation...
}
public class SomeException2 extends Exception implements SomeExceptionInterface {
// Implementation...
}
如果您需要訪問名爲a()
的方法,則需要提供該方法的類型。一個簡單的解決辦法是:
public class AbstractSubException extends Exception {
public abstract void a();
}
public class SubException1 extends AbstractSubException {
@Override public void a() { ... }
}
public class SubException2 extends AbstractSubException {
@Override public void a() { ... }
}
然後你就可以抓住你做的方式或(有點簡單):
catch (AbstractSubException e) {
e.a();
}
也許該方法a
的代碼是在所有子類相同。然後你可以使它具體化並將代碼放入父類中。
簽名無所謂,它是一些常見超類的相同方法嗎?在'SubException1'和'SubException2'的一些常見超類中定義了'a'嗎? – luk2302
你可以通過給它們一個規定方法void a()'的共同祖先來消除冗餘。然後你可以捕捉祖先並調用'e.a()' – Ishnark
當使用multicatch時,實際類型的異常局部變量是最接近的常見超類型,在你的情況下它看起來像是'Exception'。所以'SubException1'具有'a()'並不重要。正如已經提出的那樣,您可以通過在兩種方法上使用帶'a()'的通用超類型來解決此問題。 –