有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取“ArrayIndexOutOfBoundsException:null”时没有堆栈跟踪

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

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

我的问题是:

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

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

我们目前正在调试和调查,以获取更多信息,但可能有人对此很熟悉


共 (2) 个答案

  1. # 1 楼答案

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

    java.lang.ArrayIndexOutOfBoundsException: null
    

    在我的例子中,问题出在并发ArrayList中。添加调用(两个单独的线程将元素添加到共享的非同步列表中)。最有趣的是:首先ArrayIndexOutOfBoundsException总是有stacktrace和描述性消息,所有未来ArrayIndexOutOfBoundsException都没有stacktrace和消息。试图用普通java线程在单独的项目上复制-没有运气(总是得到完整的堆栈跟踪等)

    PS.OpenJDK 11,jetty服务器

  2. # 2 楼答案

    1. Stringnull引用连接可能会得到这样的消息:

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

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