获取"ArrayIndexOutOfBoundsException: null"但没有堆栈跟踪

31

我们在日志文件中发现以下内容:

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

这只有一行代码,并且没有异常堆栈跟踪。

此异常发生在执行使用javassist创建的动态生成的Java字节码的try块中。

我有两个疑问:

  1. java.lang.ArrayIndexOutOfBoundsException: null是什么样的代码会导致日志输出?我尝试使用测试程序重现,但没有成功。我总是得到类似于“java.lang.ArrayIndexOutOfBoundsException:Index:3”或类似的内容。
  2. 缺失的堆栈跟踪是否因为此代码是在运行时动态生成的,因此记录器/JVM不“知道”堆栈跟踪或相关的行编号?

我们目前正在调试和调查以获取更多信息,但也许对某些人来说这听起来很熟悉。


修改标题以更明显地表明这不是重复的问题。此问题更多地涉及为什么没有堆栈跟踪,而不是如何避免异常。 - Christoph
1
提供类似问题的链接,以帮助像我这样的陌生人在未来解决问题 :) Java中没有StackTrace的NullPointerException没有调试代理时无法获取NullPointerException堆栈跟踪 - Yoory N.
2个回答

37
  1. 使用null引用连接 String 可能会导致出现以下错误信息:

Object obj = null;
throw new ArrayIndexOutOfBoundsException("" + obj);
如果你正在使用Oracle JVM,你可能想要添加-XX:-OmitStackTraceInFastThrow作为附加参数,以查看它是否有所帮助。对于一些基本异常,在一段时间后JVM会重复使用相同的异常实例,此时不再有堆栈跟踪。此选项可以防止重用,因此您始终可以获取堆栈跟踪。
编辑注释: 这个建议也适用于最近版本的OpenJDK(例如1.8)

2
感谢-XX:-OmitStackTraceInFastThrow。不知道这个标志。似乎这就是异常不再出现的原因。我们重新启动了服务器(没有设置此标志),现在我们又看到了堆栈跟踪。 - Christoph
我在使用数组时遇到了同样的问题。参数OmitStackTraceInFastThrow可以帮助解决这个问题。谢谢。 - gontard
1
当使用某种日志框架(本例中为logback)时,没有消息的异常(例如throw new MyCoolException();)将导致输出类似于 java.lang.ArrayIndexOutOfBoundsException: null,因为记录器将在幕后连接异常的消息(在此情况下为null)到日志行的其他部分。 - Yoory N.
我正在运行一个OpenJDK JVM,版本为1.8.0u171(Debian 9),它似乎也接受“-XX:-OmitStackTraceInFastThrow”标志。我还没有确认是否是因为这个原因我也无法打印堆栈跟踪(例如使用“e.printStackTrace”),但这似乎非常可能。我已经编辑了答案以反映这一发现。 - Chris W.
所以,根据第一种可能性,导致AIOBE并带有空消息的不是实际的使用无效索引的数组访问?而只是手动抛出自定义消息的异常? - asgs

5

我发现与下面所示的令人失望日志具有相同的行为:

java.lang.ArrayIndexOutOfBoundsException: null

在我的情况下,问题出在并发的ArrayList.add调用上(两个单独的线程向共享的非同步列表中添加元素)。最有趣的事情是:第一个ArrayIndexOutOfBoundsException总是带有堆栈跟踪和描述性消息,所有后续的ArrayIndexOutOfBoundsException都没有堆栈跟踪和消息。尝试在纯Java线程的单独项目中重现 - 没有成功(始终获取完整的堆栈跟踪等)。
附注:OpenJDK 11,jetty服务器。

3
我可以确认这个问题只出现在OpenJDK 8上,并且只有第一个ArrayIndexOutOfBoundsException有堆栈跟踪信息。 - 8.8.8.8
第一次出现 java.util.ConcurrentModificationException: null 在 java.util.ArrayList$Itr.next(ArrayList.java:865) ~[?:1.8.0-zing_19.12.101.0],我尝试通过调用 clear 方法来清除数组,但没有帮助。 - JustTry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接