2011-06-30 165 views
9

我有有時拋出異常的方法,包括:爲什麼Throwable.getMessage()偶爾會返回null?

this.items[index] = element; 

我有斷言不同的是應該被拋出實際上是拋出一個單元測試:

try 
{ 
    doSomethingWithIndex(-1); 
    Assert.fail("should cause exception"); 
} 
catch (IndexOutOfBoundsException expected) 
{ 
    Assert.assertNotNull(expected.getMessage()); 
} 

此測試運行作爲連續構建的一部分,有時偶爾失敗,因爲getMessage()實際上返回null。爲什麼會發生?我的代碼永遠不會用空消息引發異常。

EDIT

我的原代碼的例子是誤導性的,被拋出的異常實際上是從直接索引的陣列來。儘管如此,我可以用自定義引發的異常來重現相同的行爲。

我添加建議的代碼:

catch (IndexOutOfBoundsException expected) 
{ 
    if (expected.getMessage() == null) 
    { 
     expected.printStackTrace(); 
    } 
    Assert.assertNotNull(expected.getMessage()); 
} 

控制檯輸出缺少除了原因堆棧跟蹤。以下是全部輸出:

java.lang.ArrayIndexOutOfBoundsException 
+3

你確定它不是由別的東西拋出的IndexOutOfBoundsException嗎?當你遇到這個問題時,我建議你轉儲'expected'的棧跟蹤。 –

+0

我第二個喬恩的建議。不要忘記,您可能正在捕獲ArrayIndexOutOfBoundsException或StringIndexOutOfBoundsException。 –

+0

@ Ted,@ Jon:是不是默認的StringIndexOutOfBoundException和ArrayIndexOutOfBoundException在被拋出時生成一個味精? (你試圖訪問的元素)? – amit

回答

1

嘗試打印具有空消息的異常的堆棧跟蹤時。其他一些代碼可能會拋出它。就像你實際訪問過去的數組長度。

0

您寫道: 「我的代碼不能拋出異常與空消息」

你yousing任何第三方庫?我認爲標準的java代碼從不會拋出像上面這樣的異常,但是一些傾注了編碼的jar ...... :)

+0

沒有第三方庫。對於我自己拋出的異常和直接使用-1索引引用數組,我看到這種「閃爍」行爲。 –