2017-06-01 51 views
2

我有兩個類從java.lang.Exception繼承。他們都有一個相同的簽名void a(){...}的方法。它們都可以被引入代碼塊中。如果我做的:多重例外捕獲中的未定義方法

catch (SubException1 | SubException2 e) 
    { 
     e.a(); 
    } 

然後,它不能編譯,因爲方法a()不屬於異常。這是Java語言缺陷嗎?我應該如何正確設計我的代碼以防止代碼冗餘?

+0

簽名無所謂,它是一些常見超類的相同方法嗎?在'SubException1'和'SubException2'的一些常見超類中定義了'a'嗎? – luk2302

+1

你可以通過給它們一個規定方法void a()'的共同祖先來消除冗餘。然後你可以捕捉祖先並調用'e.a()' – Ishnark

+0

當使用multicatch時,實際類型的異常局部變量是最接近的常見超類型,在你的情況下它看起來像是'Exception'。所以'SubException1'具有'a()'並不重要。正如已經提出的那樣,您可以通過在兩種方法上使用帶'a()'的通用超類型來解決此問題。 –

回答

3

當您在單個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... 
} 
2

如果您需要訪問名爲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的代碼是在所有子類相同。然後你可以使它具體化並將代碼放入父類中。

相關問題