在我们的日志文件中,我们发现以下内容:
[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
块正在执行使用javassist创建的动态生成的Java字节码。
我想知道两件事:
java.lang.ArrayIndexOutOfBoundsException
:null logger.error("message", theException)
块内使用catch
调用了日志挂钩,这通常会导致在日志文件中打印完整的堆栈跟踪。我的问题:
哪种代码可以导致日志输出“java.lang.ArrayIndexOutOfBoundsException:null”。我尝试用没有运气的测试程序重现这个。我总是得到类似“java.lang.ArrayIndexOutOfBoundsException:Index:3”或类似内容的东西。
缺少堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger / JVM不会“知道”堆栈跟踪或相关行号?
我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉。
答案 0 :(得分:24)
String
引用连接的 null
可能会给您留言:
Object obj = null;
throw new ArrayIndexOutOfBoundsException("" + obj);
如果您使用的是Oracle JVM,则可能需要添加-XX:-OmitStackTraceInFastThrow
作为附加参数,以查看它是否有帮助。对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪。此选项可防止重用,因此您始终可以获得堆栈跟踪。
编辑注释:最后一个版本也适用于最新版本的OpenJDK(例如,1.8)
答案 1 :(得分:1)
我发现令人失望的日志几乎具有相同的行为,如下所示:
java.lang.ArrayIndexOutOfBoundsException: null
就我而言,问题出在并发的ArrayList.add调用中(两个单独的线程将元素添加到共享的非同步列表中)。最有趣的是: first ArrayIndexOutOfBoundsException始终具有堆栈跟踪和描述性消息,所有将来的 ArrayIndexOutOfBoundsExceptions都没有stacktrace和消息。试图在带有普通Java线程的单独项目上重现-没运气(总是有完整的stacktraces等)。
PS。 OpenJDK 11,码头服务器。