如何分析由忽略的ExceptionInInitializerError引起的NoClassDefFoundError?

2024-03-28

今天我花了一个下午的时间来分析 NoClassDefFoundError。一次又一次验证类路径后,发现有一个类的静态成员抛出了第一次被忽略的异常。之后,每次使用该类都会抛出 NoClassDefFoundError ,而没有有意义的堆栈跟踪:

Exception in thread "main" java.lang.NoClassDefFoundError: 
    Could not initialize class InitializationProblem$A
    at InitializationProblem.main(InitializationProblem.java:19)

就这样。不再需要排队。

归根结底,这就是问题所在:

public class InitializationProblem {
    public static class A {
        static int foo = 1 / 0;
        static String getId() {
            return "42";
        }
    }

    public static void main( String[] args ) {
        try {
            new A();
        }
        catch( Error e ) {
            // ignore the initialization error
        }

        // here an Error is being thrown again,
        // without any hint what is going wrong.
        A.getId();
    }
}

为了让它不那么容易,除了最后一个电话A.getId()隐藏在一个非常大的项目的初始化代码中的某个地方。

问题:

现在我经过几个小时的反复试验发现了这个错误,我想知道是否有一种直接的方法可以从抛出的异常开始找到这个错误。关于如何做到这一点有什么想法吗?


我希望这个问题能为其他分析一个无法解释的问题的人提供一个提示NoClassDefFoundError.


实际上,您永远不应该捕获错误,但您可以通过以下方法找到可能出现的初始化程序问题。

这是一个代理,它将使所有 ExceptionInInitializerError 在创建时打印堆栈跟踪:


import java.lang.instrument.*;
import javassist.*;
import java.io.*;
import java.security.*;

public class InitializerLoggingAgent implements ClassFileTransformer {
  public static void premain(String agentArgs, Instrumentation inst) {
    inst.addTransformer(new InitializerLoggingAgent(), true);
  }

  private final ClassPool pool = new ClassPool(true);

  public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)  {
    try {
      if (className.equals("java/lang/ExceptionInInitializerError")) {
        CtClass klass = pool.makeClass(new ByteArrayInputStream(classfileBuffer));
        CtConstructor[] ctors = klass.getConstructors();
        for (int i = 0; i < ctors.length; i++) {
          ctors[i].insertAfter("this.printStackTrace();");
        }
        return klass.toBytecode();
      } else {
        return null;
      }
    } catch (Throwable t) {
      return null;
    }
  }
}

它使用 javassist 来修改类。编译并将其放入包含 javassist 类和以下 MANIFEST.MF 的 jar 文件中

Manifest-Version: 1.0
Premain-Class: InitializerLoggingAgent

运行您的应用程序java -javaagent:agentjar.jar MainClass即使捕获了每个 ExceptionInInitializerError 也会被打印。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何分析由忽略的ExceptionInInitializerError引起的NoClassDefFoundError? 的相关文章

  • 删除列表视图项目之间的间距

    我正在尝试在 Android 中制作一个包含图像的 ListView 我希望图像在列表中彼此相对 但我似乎无法消除间距 这是我的 listview xml
  • Netbeans:如何从“设计”GUI 构建器向 JTable 添加 valueChanged 侦听器?

    我右键单击 JTable 并将一些代码插入到 后侦听器代码 中 结果很糟糕 我没有看到添加选项 table getSelectionModel addListSelectionListener new ListSelectionListen
  • Android Studio - 无法识别的 VM 选项“MaxPermSize=256m”

    我刚刚在 Elementary OS 0 3 Freya 上安装了 Android Studio 并使用终端运行它 然而 在我第一次启动时 显示一条错误消息 Gradle 测试 项目刷新失败 无法启动守护进程 这个问题可能是由 守护进程的配
  • Jprofiler Linux 上的远程分析。如何更改探查器数据文件的路径

    我正在 Linux 盒子上运行 java java 6 应用程序并进行其他设置 agentpath home myuser jprofiler bin linux x64 libjprofilerti so nowait 端口 7777 在
  • Jersey 2 - ContainerRequestFilter get 方法注解

    我试图获取 ContainerRequestFilter 对象中的方法注释 控制器 GET RolesAllowed ADMIN public String message return Hello rest12 容器请求过滤器 Provi
  • 关于线程的停止

    我开发了一个代码 它将在执行时启动两个线程 public class MyThread1 extends Thread extend thread class public synchronized void run synchronize
  • 如何缓解 Apache Log4j 反序列化 RCE (CVE-2019-17571)

    我已将 log4j core 依赖项升级到 2 15 0 以防止任何潜在的 Log4Shell 攻击 话虽如此 我无法从 1 2 17 升级 slf4j log4j12 的间接 log4j 依赖项 因为 slf4j log4j12 的最新稳
  • 我的 Java Web 应用程序中的 ClassNotFoundException/NoClassDefFoundError

    我使用 Java 开发了一个 Web 应用程序 当我将其部署到我的应用程序服务器 Jetty Tomcat JBoss GlassFish 等 时 会抛出错误 我可以在堆栈跟踪中看到此错误消息 java lang ClassNotFound
  • TreeSet 给出不正确的输出 - Java8

    在处理树集时 我发现了非常奇怪的行为 根据我的理解 以下程序应该打印两行相同的行 public class TestSet static void test String args Set
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • “找不到符号”或“无法解析符号”错误是什么意思?

    请解释以下有关 找不到符号 无法解析符号 或 找不到符号 错误 Java 中 的信息 他们的意思是什么 哪些因素会导致它们 程序员如何修复它们 这个问题旨在对 Java 中的这些常见编译错误进行全面的问答 0 这些错误之间有什么区别吗 并不
  • 在 Java 中从 Json 字符串中提取字段

    我正在尝试从以下 Json 字符串中提取每个 company id 的 id String test company id 4100 data drm user id 572901936637129135 direct status id
  • LDAP中超时的实现

    我一直在处理我们正在使用的应用程序LDAP获取用户详细信息 有时获取用户详细信息需要更多时间 我想实施time out获取详细信息的方法 以便我们可以避免在最坏的情况下在服务器中挂起事务 这里我们使用的是LdapUtil我们在其中配置的类L
  • 如何使用 Java 以编程方式登录 Facebook?

    我正在尝试编写一个可以自动登录 Facebook 的 Java 程序 到目前为止 我已经得到了以下代码 可以将主页 html 页面下载到字符串中 但不知道如何发送电子邮件和密码来登录 Facebook Java 程序还需要处理返回的 coo
  • java中的new关键字是多余的吗?

    我来自 C 所以 java 的一个特性我不太理解 我读过所有对象都必须使用关键字创建new 但基元除外 现在 如果编译器可以识别原始类型 并且不允许您在不调用其构造函数的情况下创建对象new 有这个关键字的原因是什么new根本吗 有人可以提
  • 如何使用 JAVA 将本地图像而不是 URL 发送到 Microsoft Cognitive Face API

    我正在尝试使用 Microsoft 认知服务的 Face API 我想知道如何通过 Rest API 调用将本地图像发送到 Face API 并使用它请求结果JAVA 有人可以帮我解决这个问题吗 Microsoft 在其网站上提供的测试选项
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 当考虑性能时如何从文件中读取整数?

    我正在 CodeEval 上执行一些任务 基本上任务非常简单 打印出从文件中读取的所有整数的总和 我的解决方案如下 import java io File import java io IOException import java io
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 如何将钱兑换成零钱

    尝试将输入的数字转换为 25 美分 50 美分 10 美分和 10 分 有几个问题 public class Coins public static void main String args private int quarters di

随机推荐

  • 字母数字会包含 _ 和空格吗?

    如果字段定义为字母数字 是否允许使用空格和下划线 我希望他们不是 有人能证实吗 根据定义 字母数字字符仅包含字母 A 到 Z 和数字 0 到 9 空格和下划线通常被视为标点符号 因此不应该允许使用它们 如果某个字段明确指出 字母数字字符 空
  • Perl 中有 inf 常量吗?

    我正在为算法初始化一个无穷大的列表 写作 x 9 9 9感觉不直观 而且我将来可能想使用 BigInt 1 0抛出错误 获得的规范方法是什么inf 您可以使用特殊字符串 inf perl E say inf 1 inf perl E say
  • .htaccess 用于 HTML5 模式的 AngularJS 应用程序的子文件夹

    概述 我有一个 AngularJS 应用程序 它使用 locationProvider html5Mode true 它由 Apache 服务器提供 到目前为止 我使用的源代码是从其他人那里访问的 我只需要重定向到 index html 以
  • 为什么 EnumerateFiles 比计算大小快得多

    对于我的 WPF 项目 我必须计算单个目录 可能有子目录 中的总文件大小 Sample 1 DirectoryInfo di new DirectoryInfo path var totalLength di EnumerateFiles
  • Android 中如何获取当前 Button 文本颜色?

    我不知道如何获取按钮文本的当前颜色 我知道可能是这样 但无法完全弄清楚参数 public static int getTextColor Context context TypedArray attrs int def 基本上我正在尝试这样
  • 渲染问题无法加载LayoutLib:

    渲染问题无法加载LayoutLib com android layoutlib bridge Bridge 详情 org jetbrains android uipreview RenderingException Failed to lo
  • 在 xml 编辑器中在字符串资源的引用和值预览之间切换

    在 Android Studio 中使用 xml 值并引用时 Strings xy例如 我在视频中看到 实际上可以直接在同一编辑器窗口中显示实际值 它是基本上是在之间切换 String xy和 XYContent 但引用仍然存在 我不是指
  • 在服务器上强制 svn:eol-style=native?

    目前 为了保证颠覆性eol style被设定为native对于添加到项目中的每个新文件 我们必须将其添加到 subversion config我们每台开发人员机器上的文件 miscellany enable auto props yes a
  • c# Xamarin UITextField 设置光标位置

    我需要将 UITextField 的光标定位在与另一个先前文本字段完全相同的位置 我将光标在第一个文本字段中的位置设为nint index txtToField GetOffsetFromPosition txtToField Beginn
  • Android 时差与乔达时间

    我有这个简单的代码 使用 Joda time 工作正常 但我有一个问题 比如返回814分钟 通过代码就可以了 但我希望结果少于 60 分钟 而不是 814 分钟 那么 我该如何转换这 814 分钟才能得到我想要的结果呢 同样的情况也发生在几
  • YouTube Live API 流状态和质量回调

    In the Live Control Room of a YouTube Live broadcast I can see a Stream Status view which shows me details of the video
  • 尝试上传到 Amazon S3 时出现“不支持的正文有效负载对象”

    我想将文件从我的前端上传到我的 Amazon S3 AWS 我正在使用 dropzone 因此我转换文件并将其发送到我的后端 在我的后端我的文件是这样的 fieldname file originalname test torrent en
  • 从 Mono 列表创建 Flux 的正确方法

    假设我有一个使用 CustomObjects 列表的 API 操作 对于其中的每一个对象 它都会调用一个创建 Mono 的服务方法 如何以惯用且非阻塞的方式从这些 Mono 对象创建 Flux 我现在想到的就是这个 我更改了方法名称以更好地
  • 如何在 Telegram API 中转发消息

    Telegram API 中有 2 种转发消息的方法 messages forwardMessage messages forwardMessages 我想用forwardMessage转发消息的方法channel group or use
  • 修复了 div 内的非滚动页脚?

    我正在页面中央制作一个小 div 它有一个固定的页脚 但该 div 是可滚动的 根据我的说法 有两种方法可以做到这一点 Using position fixed 固定位置实际上是相对于浏览器窗口起作用的 但我想要相对于我的小 div 的位置
  • 如何测试一个字符串是否包含多个子字符串之一?

    我想知道一个字符串是否包含以下之一abc def xyz等等 我可以这样做 a Contains abc or a Contains def or a Contains xyz 好吧 它可以工作 但是如果这个子字符串列表发生变化 我必须更改
  • 如何在 mvc3 razor 视图中使用会话变量保留数据?

    我正在使用 Razor 开发 MVC3 应用程序 在验证用户后 在我的帐户控制器中 我从数据库获取用户 ClientID 这里我想将 ClientID 保留在 Session 变量中 它在所有控制器和 Razor 视图中使用 我不知道实现此
  • 在Java中删除文件的内容

    我正在将字节写入 temp fls 文件 完成操作后 我想从 temp fls 文件中删除最后 256 个字节 我怎样才能实现这个目标 请帮我 提前致谢 Use RandomAccessFile setLength http java su
  • 如何在 Ansible 中的 do-until 循环中指定多个条件

    我正在拨打 REST 电话 并想在继续之前检查我的请求是否已完成 在响应中 我收到 PENDING 或 IN PROGRESS 作为 request status 我想等到我得到 完成 或 失败 为此 我想在收到 PENDING 或 IN
  • 如何分析由忽略的ExceptionInInitializerError引起的NoClassDefFoundError?

    今天我花了一个下午的时间来分析 NoClassDefFoundError 一次又一次验证类路径后 发现有一个类的静态成员抛出了第一次被忽略的异常 之后 每次使用该类都会抛出 NoClassDefFoundError 而没有有意义的堆栈跟踪