Java 获得;ArrayIndexOutOfBoundsException:null";没有堆栈跟踪
在我们的日志文件中,我们发现以下内容:Java 获得;ArrayIndexOutOfBoundsException:null";没有堆栈跟踪,java,logging,logback,stack-trace,bytecode,Java,Logging,Logback,Stack Trace,Bytecode,在我们的日志文件中,我们发现以下内容: [2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName" Some error happened: java.lang.ArrayIndexOutOfBoundsException: nul
[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
:nullcatch
块内使用logger.error(“message”,theException)
调用日志挂钩,这通常会导致在日志文件中打印完整的堆栈跟踪String
与null
引用连接可能会得到这样一条消息:
Object obj = null;
throw new ArrayIndexOutOfBoundsException("" + obj);
-XX:-OmitStackTraceInFastThrow
作为附加参数,以查看它是否有帮助。对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪。此选项可防止重用,因此始终可以获得堆栈跟踪编辑说明:最后一个可能也适用于OpenJDK的最新版本(如1.8)我发现在令人失望的日志中几乎有相同的行为,如下所示:
java.lang.ArrayIndexOutOfBoundsException: null
在我的例子中,问题在于并发的ArrayList.add调用(两个单独的线程将元素添加到共享的非同步列表中)。最有趣的是:首先ArrayIndexOutOfBoundsException总是有stacktrace和描述性消息,所有未来ArrayIndexOutOfBoundsException都没有stacktrace和消息。试图用普通java线程在单独的项目上复制-没有运气(总是得到完整的堆栈跟踪等)
PS.OpenJDK 11,jetty服务器 谢谢你的-XX:-stacktraceinfastthrow。我不知道那面旗。似乎是异常不再出现的原因。我们重新启动了服务器(没有设置此标志),现在我们再次看到堆栈跟踪。我在数组中遇到了同样的问题。参数OmitStackTraceInFastThrow有帮助。谢谢。当使用某种日志框架(在本例中为logback)时,没有消息的异常(例如,
抛出新的mycolexception();
)将导致类似于java.lang.ArrayIndexOutOfBoundsException:null的输出,因为日志将连接异常的消息(在本例中为null)我正在运行一个OpenJDK JVM,版本1.8.0u171(Debian 9),它似乎也接受-XX:-OmitStackTraceInFastThrow
标志。我还没有确认这是否也是我无法打印堆栈跟踪的原因(例如,使用e.printStackTrace
),但这似乎很有可能。我对答案进行了编辑,以反映这一发现。编辑了标题,使其更加明显,这不是重复。这里的问题更多的是关于没有堆栈跟踪的原因,而不是如何避免异常。链接到类似的问题,以帮助将来像我这样的陌生人:)和。我可以在OpenJDK 8上确认这一点,只有第一个ArrayIndexOutOfBoundsException具有stacktrace。第一次java.util.ConcurrentModificationException:null位于java.util.ArrayList$Itr.next(ArrayList.java:865)~[?:1.8.0-zing_19.12.101.0]我明白了这一点,我试图通过调用clear来清理数组,但没有帮助