使用NO堆栈跟踪获取“ArrayIndexOutOfBoundsException:null”

时间:2012-09-25 11:50:05

标签: 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: null

只有这一行,没有异常堆栈跟踪。

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

我想知道两件事:

  1. java.lang.ArrayIndexOutOfBoundsException:null
  2. 缺少堆栈跟踪,尽管在logger.error("message", theException)块内使用catch调用了日志挂钩,这通常会导致在日志文件中打印完整的堆栈跟踪。
  3. 我的问题:

    1. 哪种代码可以导致日志输出“java.lang.ArrayIndexOutOfBoundsException:null”。我尝试用没有运气的测试程序重现这个。我总是得到类似“java.lang.ArrayIndexOutOfBoundsException:Index:3”或类似内容的东西。

    2. 缺少堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger / JVM不会“知道”堆栈跟踪或相关行号?

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

2 个答案:

答案 0 :(得分:24)

    String引用连接的
  1. null可能会给您留言:

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    
  2. 如果您使用的是Oracle JVM,则可能需要添加-XX:-OmitStackTraceInFastThrow作为附加参数,以查看它是否有帮助。对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪。此选项可防止重用,因此您始终可以获得堆栈跟踪。

  3. 编辑注释:最后一个版本也适用于最新版本的OpenJDK(例如,1.8)

答案 1 :(得分:1)

我发现令人失望的日志几乎具有相同的行为,如下所示:

java.lang.ArrayIndexOutOfBoundsException: null

就我而言,问题出在并发的ArrayList.add调用中(两个单独的线程将元素添加到共享的非同步列表中)。最有趣的是: first ArrayIndexOutOfBoundsException始终具有堆栈跟踪和描述性消息,所有将来的 ArrayIndexOutOfBoundsExceptions都没有stacktrace和消息。试图在带有普通Java线程的单独项目上重现-没运气(总是有完整的stacktraces等)。

PS。 OpenJDK 11,码头服务器。