2013-12-14 103 views
1

我正在學習Java中的功能,包括異常。我在編寫自定義例外。下面是我在做什麼:自定義異常類:在java中的自定義異常的超類構造函數

public class ServiceException extends Exception { 

    private String customMessage; 

    public ServiceException(String customMessage) { 
     super(customMessage); 
     this.customMessage = customMessage; 

    } 
} 

主要類:

public class Main { 

    public static void main(String[] args) { 
     try { 
      new Main().test(); 
     } catch (Exception e) { 
      System.out.println("the exception message is " + e.getMessage()); 
     } 
    } 

    public void test() throws ServiceException { 
     try { 
      int i = 1/0; 
     } catch (Exception e) { 
      throw new ServiceException(e.getMessage()); 
     } 
    } 
} 

這一點我知道: 如果超類的構造函數是不是在自定義異常類調用,該郵件設定在自定義異常中不傳遞給Exception類。但是,如果我的自定義異常類中有一個方法public String getMessage,即使未調用super,也會打印該消息。對不起,如果這是一個天真的問題。但我無法理解他的概念。可以來幫助清除這個概念嗎?

回答

0

在捕獲錯誤的主要地方,基本上是將一個ServiceException對象分配給Exception引用,即將派生類對象分配給基類引用,所以如果派生類重寫了方法,它將被調用。

被調用的e.message()來自ServiceException而不是Exception,你是對的,當你沒有調用super時,沒有數據被傳遞,數據僅在ServiceException類中,而且調用的函數也來自ServiceException類。

+0

結帳動態多態。一個簡單的headstart鏈接:http://way2java.com/oops-concepts/dynamic-polymorphism/ – gaurav5430

+0

你讓我的一天!非常感謝 – parameswar

0

那是因爲你正在提供它。您將通過e.getMessage()作爲唯一參數customMessage傳遞給您的構造函數。然後,您將customMessage傳遞給其父級的構造函數,該構造函數需要String,Exception(String)。在這樣做的時候,你給它的信息是用於serviceExceptionInstance.getMessage()。相反,不要將customMessage傳遞給它的父代(使用​​,如果沒有給出父構造函數的調用並且存在無參數父構造函數,則暗示customMessage)。然後該消息將爲null,因爲它沒有提供。

換句話說:

new ServiceException(e.getMessage()); 

創建一個新的ServiceException與來自e該消息。您將該消息傳遞給ExceptionServiceException的父母。

super(customMessage); 

在這樣做時,你用一個參數,StringException基於構造函數。將值傳遞給該構造函數意味着您希望在調用者調用getMessage時使用它。爲了避免這樣做,調用不同的父類的構造,或根本沒有(呼叫沒有在技術上是不可能的,它會暗中爲你做​​):

public ServiceException(String customMessage) 
{ 
    this.customMessage = customMessage; 
} 

這將調用​​對你來說,這意味着父類沒有消息要發送,並且由不是自己覆蓋getMessage(),那麼它將返回它的默認值(null)。要清楚,Exception本身從Throwable延伸,這真的是提供此功能的類,但它全部源於您如何使用Exception,因爲它用作傳遞到Throwable

+0

我明白當我提供超級的過程,但我不明白的是當我不提供超級。那麼如何從getMessage函數打印消息?有沒有數據傳遞給父類Exception? – parameswar

+0

如果不提供超級,那麼它沒有提供消息。它假定_no_消息,並且默認值爲'null。' – pickypg

+0

是的,但是如果有一個getMessage方法返回自定義異常類中的字符串,e.getMessage不是null?是否因爲自定義異常中的getMessage覆蓋了Exception類中的getMessage? – parameswar