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

Cra*_*lin 9 java exception

我有一个方法,有时会抛出异常:

this.items[index] = element;
Run Code Online (Sandbox Code Playgroud)

我有一个单元测试断言应该抛出的异常实际抛出:

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

此测试作为连续构建的一部分运行,有时偶尔会失败,因为getMessage()实际上返回null.为什么会这样?我的代码永远不会抛出空消息的异常.

编辑

我的原始代码示例具有误导性,抛出的异常实际上来自直接索引数组.我可以使用自定义抛出异常重现相同的行为.

我添加了建议的代码:

catch (IndexOutOfBoundsException expected)
{
    if (expected.getMessage() == null)
    {
        expected.printStackTrace();
    }
    Assert.assertNotNull(expected.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

除原因外,控制台输出缺少堆栈跟踪.这是完整的输出:

java.lang.ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)

Cra*_*lin 9

找到了类似问题的答案.

如果它们足够发生,JIT编译器将在某些例外中优化掉堆栈跟踪.

JVM标志-XX:-OmitStackTraceInFastThrow可以防止此行为,并且似乎可以修复闪烁单元测试.