Java 为什么Throwable.getMessage()偶尔返回null?

Java 为什么Throwable.getMessage()偶尔返回null?,java,exception,Java,Exception,我有一个方法有时会引发异常: this.items[index] = element; 我有一个单元测试,它断言应该抛出的异常实际上是抛出的: try { doSomethingWithIndex(-1); Assert.fail("should cause exception"); } catch (IndexOutOfBoundsException expected) { Assert.assertNotNull(expected.getMessage()); }

我有一个方法有时会引发异常:

this.items[index] = element;
我有一个单元测试,它断言应该抛出的异常实际上是抛出的:

try
{
    doSomethingWithIndex(-1);
    Assert.fail("should cause exception");
}
catch (IndexOutOfBoundsException expected)
{
    Assert.assertNotNull(expected.getMessage());
}
此测试作为连续构建的一部分运行,有时会失败,因为getMessage()实际上返回null。为什么会发生这种情况?我的代码永远不会抛出带有空消息的异常

编辑

我最初的代码示例有误导性,抛出的异常实际上来自直接对数组进行索引。不过,我可以用自定义抛出的异常重现相同的行为

我添加了建议的代码:

catch (IndexOutOfBoundsException expected)
{
    if (expected.getMessage() == null)
    {
        expected.printStackTrace();
    }
    Assert.assertNotNull(expected.getMessage());
}
除了原因之外,控制台输出还缺少堆栈跟踪。以下是完整的输出:

java.lang.ArrayIndexOutOfBoundsException

当异常包含空消息时,请尝试打印异常的堆栈跟踪。有可能是其他代码抛出了它。就像您实际访问过去的数组长度一样。

您写道: “我的代码永远不会抛出带有空消息的异常”

你在使用第三方图书馆吗?我假设标准java代码从来不会抛出像上面这样的异常,但是一些错误编码的jar…:)

在地图上找到了答案


JVM标志-XX:-OmitStackTraceInFastThrow阻止了这种行为,似乎修复了闪烁的单元测试。

您确定这不是由其他东西引发的IndexOutOfBoundsException吗?我建议您在遇到此问题时转储
expected
的堆栈跟踪。我支持Jon的建议。不要忘记,您可能正在捕获ArrayIndexOutOfBoundsException或StringIndexOutOfBoundsException。@Ted,@Jon:默认的StringIndexOutOfBoundException和ArrayIndexOutOfBoundException在抛出时不是生成消息吗?(您试图访问的元素)?@amit:是的,但它看起来像是将ArrayIndexOutOfBoundsException抛出的东西……我不确定这是否只是示例代码来说明一点,但您的单元测试是否确实断言了异常消息是什么?为什么?没有第三方库。对于我自己抛出的异常和直接引用带有-1索引的数组,我都看到了这种“闪烁”行为。