Почему Throwable.getMessage () иногда возвращает ноль? - PullRequest
9 голосов
/ 30 июня 2011

У меня есть метод, который иногда выдает исключение:

this.items[index] = element;

И у меня есть модульный тест, который утверждает, что исключение, которое должно быть сгенерировано, действительно выброшено:

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

Этот тест выполняется как часть непрерывной сборки, а иногда, иногда, происходит сбой, потому что getMessage () фактически возвращает ноль.Почему это случилось?Мой код никогда не может выдать исключение с пустым сообщением.

РЕДАКТИРОВАТЬ

Мой оригинальный пример кода вводил в заблуждение, генерируемое исключение на самом деле происходит от прямой индексации массива.Я могу воспроизвести то же поведение с пользовательским сгенерированным исключением, хотя.

Я добавил предложенный код:

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

В выводе консоли отсутствует трассировка стека в дополнение к причине.Вот полный вывод:

java.lang.ArrayIndexOutOfBoundsException

Ответы [ 3 ]

9 голосов
/ 30 июня 2011

Нашел ответ на подобный вопрос .

JIT-компилятор оптимизирует удаление следов стека в определенных исключениях, если они произойдут достаточно.

Флаг JVM -XX: -OmitStackTraceInFastThrow предотвращает это поведение и, похоже, исправляет мерцающие юнит-тесты.

1 голос
/ 30 июня 2011

Попробуйте распечатать трассировку стека исключительной ситуации, когда у него пустое сообщение.Возможно, что какой-то другой код его выбрасывает.Как будто вы на самом деле обращаетесь к прошлой длине массива.

0 голосов
/ 30 июня 2011

Вы написали, что: «Мой код никогда не может выдать исключение с пустым сообщением»

Вы используете какую-нибудь стороннюю библиотеку? Я предполагаю, что стандартные java-коды никогда не генерируют исключений, подобных приведенным выше, но некоторые залитые jar-кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...