Получение "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.
Меня интересуют две вещи:
-
java.lang.ArrayIndexOutOfBoundsException
: null - Отсутствует трассировка стека, несмотря на вызов ловушки журнала с использованием
logger.error("message", theException)
внутри блока catch
, что обычно приводит к полной трассировке стека, печатаемой в файле журнала.
Мои вопросы:
-
Какой код может вызвать вывод журнала "java.lang.ArrayIndexOutOfBoundsException: null". Я пытаюсь воспроизвести это с помощью тестовой программы без удачи. Я всегда получаю что-то вроде "java.lang.ArrayIndexOutOfBoundsException: Index: 3" или подобное.
-
Может ли быть причиной пропуска трассировки стека то, что этот код генерируется динамически во время выполнения, и поэтому регистратор /JVM не "знает" трассировку стека или соответствующие номера строк?
В настоящее время мы проводим отладку и расследование, чтобы получить больше информации, но, возможно, это кому-то знакомо.
Ответы
Ответ 1
-
String
конкатенированная с null
ссылкой, может получить такое сообщение:
Object obj = null;
throw new ArrayIndexOutOfBoundsException("" + obj);
-
Если вы используете Oracle JVM, вы можете добавить -XX:-OmitStackTraceInFastThrow
в качестве дополнительного параметра, чтобы посмотреть, поможет ли это. Для некоторых основных исключений JVM через некоторое время повторно использует один и тот же экземпляр исключения, и в этом случае стек больше не отслеживается. Эта опция предотвращает повторное использование, поэтому вы всегда получаете трассировку стека.
Примечание к редактированию: последнее также может относиться к последней версии OpenJDK (например, 1.8)
Ответ 2
Я обнаружил почти такое же поведение с разочаровывающим журналом, как показано ниже:
java.lang.ArrayIndexOutOfBoundsException: null
В моем случае проблема была в параллельных вызовах ArrayList.add (два отдельных потока добавили элементы в общий несинхронизированный список). Самое интересное: первое ArrayIndexOutOfBoundsException всегда имело трассировку стека и описательное сообщение, все будущие исключения ArrayIndexOutOfBoundsException были без трассировки стека и сообщения. Пытался воспроизвести на отдельном проекте с простыми потоками Java - не повезло.
PS. OpenJDK 11, пристенный сервер.