27

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

[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
  2. logger.error("message", theException)尽管在块内部调用了日志挂钩,但缺少堆栈跟踪,catch这通常会导致在日志文件中打印完整的堆栈跟踪。

我的问题:

  1. 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsException: null”。我尝试用一​​个没有运气的测试程序来重现这个。我总是得到类似“java.lang.ArrayIndexOutOfBoundsException:Index:3”或类似的东西。

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

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

4

2 回答 2

33
  1. Stringnull参考连接可能会给您这样的消息:

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

编辑说明:最后一个也适用于 OpenJDK 的最新版本(例如 1.8)

于 2012-09-25T12:02:57.210 回答
3

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

java.lang.ArrayIndexOutOfBoundsException: null

In my case, the problem was in concurrent ArrayList.add calls (two separate threads added elements into shared unsynchronized list). The most interesting thing: first ArrayIndexOutOfBoundsException always had stacktrace and descriptive message, all future ArrayIndexOutOfBoundsExceptions were without stacktrace and message. Tried to reproduce on separate project with plain java threads - no luck (always got full stacktraces etc).

PS. OpenJDK 11, jetty server.

于 2019-06-06T09:39:42.433 回答