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

时间:2011-06-30 17:35:23

标签: java exception

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

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

3 个答案:

答案 0 :(得分:9)

similar question找到答案。

The JIT compiler will optimize away stack traces in certain exceptions if they happen enough.

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

答案 1 :(得分:1)

尝试在具有空消息时打印异常的堆栈跟踪。其他一些代码可能会抛出它。就像你实际访问过去的数组长度一样。

答案 2 :(得分:0)

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

你在想任何第三方图书馆吗?我假设标准的java代码永远不会抛出像上面这样的异常,但是有些pourly编码的jar ...:)