2017-06-01 60 views
0

有了這樣的getMessage()上的異常對象不提供空

public static void main(String[] args) { 
    Exception one = new Exception("my cause"); 
    System.out.println("A) " + one.getMessage()); 

    System.out.println(); 

    Exception two = new Exception(one); 
    System.out.println("B) " + two.getMessage()); 
    System.out.println("C) " + two.getCause().getMessage()); 

    System.out.println(); 

    Exception three = new Exception("my message", one); 
    System.out.println("D) " + three.getMessage()); 
    System.out.println("E) " + three.getCause().getMessage()); 

    System.out.println(); 

    Exception fourth = new Exception(null, one); 
    System.out.println("F) " + fourth.getMessage()); 
    System.out.println("G) " + fourth.getCause().getMessage()); 
} 

輸出一個代碼是這樣一個

A) my cause 

B) java.lang.Exception: my cause 
C) my cause 

D) my message 
E) my cause 

F) null 
G) my cause 

參見BF

之間的差異在兩個我沒有提供消息的情況,但不同的是,在B的情況下,null的值不是強制的。

似乎爲B情況下,沒有指定的消息時,則getMessage()方法提供的格式 className: cause.getMessage() 但我除了具有null值(如對於F情況)。

有沒有辦法讓null值(如F)如果我呼籲已創建只有cause而不是message提供一個異常getMessage

回答

3

看看Exception's JavaDoc。對於只需要一個Throwable構造:

構造新的與指定的原因和(cause==null ? null : cause.toString())詳細消息(它通常包含的cause類和詳細信息)異常。此構造函數對於比其他throwables的包裝稍微多些的異常很有用(例如,PrivilegedActionException)。

因此,在您的B案例中,由於原因不爲空,您將得到值cause.toString()作爲容器異常的消息。

如果使用該構造函數來創建異常,那麼當您捕獲異常時,就已經太遲了 - 它已經有了一個如上所述的詳細消息。由於詳細信息不爲空,你不能得到「空」。您可以將其與原因toString()進行比較,並推斷它應該爲空,但這是一個混亂,理論上,原因的消息可能會隨時間而改變,並且在捕獲時會有所不同。

+0

我用一個處理此行爲的簡單方法編輯主消息。這可能不是最好的方法,但對我的情況工作得很好。 –

+0

噢好吧,我總是用適當的解決方案編輯主要問題(清楚地表明這是第一個問題的編輯)。我加了一個不同的答覆。現在希望更好 –

0

基礎上@RealSkeptic回覆我創建了一個方法,像這樣

public static String getMessageOrNull(Throwable t) { 
    String message = t.getMessage(); 

    if (t.getCause() != null && message.equals(t.getCause().toString())) { 
     message = null; 
    } 

    return message; 
} 

它可能不是最好的辦法,但我的情況下工作得很好。

0

你可以簡單地構建它以同樣的方式,躲在它的靜態方法:

​​

或者你定義自己的類,將使用Exception(String, Throwable)構造像

public MyExceptoin extends Exception{ 

    public MyException(Throwable cause){ 
     super(null, cause); 
    } 
} 

這將是稍後使用更簡單。