Подтвердить что ты не робот

Получение "ArrayIndexOutOfBoundsException: null" без трассировки стека

В наших файлах журнала мы находим следующее:

[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName"  Some error happened:  java.lang.ArrayIndexOutOfBoundsException: null

Существует только одна строка, и нет трассировки стека исключений.

Блок try в котором происходит это исключение, выполняет динамически сгенерированный Java-байт-код, который был создан с использованием javassist.

Меня интересуют две вещи:

  1. java.lang.ArrayIndexOutOfBoundsException: null
  2. Отсутствует трассировка стека, несмотря на вызов ловушки журнала с использованием logger.error("message", theException) внутри блока catch, что обычно приводит к полной трассировке стека, печатаемой в файле журнала.

Мои вопросы:

  1. Какой код может вызвать вывод журнала "java.lang.ArrayIndexOutOfBoundsException: null". Я пытаюсь воспроизвести это с помощью тестовой программы без удачи. Я всегда получаю что-то вроде "java.lang.ArrayIndexOutOfBoundsException: Index: 3" или подобное.

  2. Может ли быть причиной пропуска трассировки стека то, что этот код генерируется динамически во время выполнения, и поэтому регистратор /JVM не "знает" трассировку стека или соответствующие номера строк?

В настоящее время мы проводим отладку и расследование, чтобы получить больше информации, но, возможно, это кому-то знакомо.

4b9b3361

Ответ 1

  1. String конкатенированная с null ссылкой, может получить такое сообщение:

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    
  2. Если вы используете Oracle JVM, вы можете добавить -XX:-OmitStackTraceInFastThrow в качестве дополнительного параметра, чтобы посмотреть, поможет ли это. Для некоторых основных исключений JVM через некоторое время повторно использует один и тот же экземпляр исключения, и в этом случае стек больше не отслеживается. Эта опция предотвращает повторное использование, поэтому вы всегда получаете трассировку стека.

Примечание к редактированию: последнее также может относиться к последней версии OpenJDK (например, 1.8)

Ответ 2

Я обнаружил почти такое же поведение с разочаровывающим журналом, как показано ниже:

java.lang.ArrayIndexOutOfBoundsException: null

В моем случае проблема была в параллельных вызовах ArrayList.add (два отдельных потока добавили элементы в общий несинхронизированный список). Самое интересное: первое ArrayIndexOutOfBoundsException всегда имело трассировку стека и описательное сообщение, все будущие исключения ArrayIndexOutOfBoundsException были без трассировки стека и сообщения. Пытался воспроизвести на отдельном проекте с простыми потоками Java - не повезло.

PS. OpenJDK 11, пристенный сервер.