当前位置: 首页 > 知识库问答 >
问题:

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

松亦
2023-03-14

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

[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("mail", theException)调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。

我的问题:

>

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

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

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

  • 共有2个答案

    柴意智
    2023-03-14

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

    java.lang.ArrayIndexOutOfBoundsException: null
    

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

    PS.OpenJDK 11,jetty server。

    陆翔飞
    2023-03-14

    >

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    

    如果您使用的是Oracle JVM,您可能需要添加一个附加参数,看看它是否有帮助。对于一些基本异常,JVM会在一段时间后重用相同的异常实例,在这种情况下,不再有堆栈跟踪。此选项可防止重用,因此始终可以获得堆栈跟踪。

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

     类似资料:
    • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

    • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

    • 当Xdebug被激活时,只要PHP决定显示通知,警告,错误等,就会显示堆栈跟踪。堆栈跟踪显示的信息以及显示方式可以根据您的需要进行配置。 Xdebug在错误情况下显示的堆栈跟踪信息量相当保守(如果display.errors 在php.ini中设置为On)。这是因为大量的信息会减慢脚本的执行速度和浏览器中堆栈跟踪本身的渲染速度。但是,可以使堆栈轨迹以不同的设置显示更详细的信息。 堆栈跟踪中的变量

    • Edit2 @Paradematic在建议重定向而不是抛出异常方面做得很好;这解决了日志记录问题。Play 2中的问题是,重定向需要发生在所谓的范围内,而日期解析器调用并不总是这样。 最初的 有一个问题,即我的application.log被与uri日期解析器操作相关的错误填满,如果给定有效的uri日期,该操作应该成功。 然而,一些用户试图通过输入无效日期来规避这一点,希望获得免费访问付费订阅者专

    • 前言我改了标题。很难理解为什么在调试时,有时未被捕获的异常会向Logcat输出“致命异常”,而有时不会。 下面的简化示例在我到达 line 时崩溃了。Logcat 内部没有堆栈跟踪或其他指示,说明出了什么问题。我运行的是 Android Studio 3.0.0beta4。 为什么它会崩溃?(更新-崩溃是由于安全例外) 为什么Logcat不显示堆栈跟踪或其他错误 更新好了,我知道它为什么崩溃了。我

    • 问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。