Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获得;ArrayIndexOutOfBoundsException:null";没有堆栈跟踪_Java_Logging_Logback_Stack Trace_Bytecode - Fatal编程技术网

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

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

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

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

  • String
    null
    引用连接可能会得到这样一条消息:

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    
  • 如果您使用的是Oracle JVM,则可能需要添加
    -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来清理数组,但没有帮助