0

我在 A 类中有以下方法。所有 A、B、C 类和调用“A”的主类都在同一个 jar 中。

public class A {    
    private static void init() {
        if (!init) {
            synchronized (B.class) {
                if (!init) {
                    map = C.creat();
                    init = true;
                }
            }
        }
    }
}

代码在块(第 4 行)处抛出Throwable, 。由于所有类都在同一个 jar 中,这可能是什么原因,在运行时没有机会找不到类。java.lang.NoClassDefFoundErrorsynchronized

我已经完成了现有问题中的解决方案,但找不到解决方案。请帮忙。

B类中有静态初始化块和静态变量。

static object/class A如果我使用 a来同步代码段而不是“B” ,则可以解决此问题。我很想知道为什么我会遇到异常以及如何仅使用 B 类来修复它。

4

3 回答 3

0

B在使用 之前有没有提到任何方法或变量B.class?如果没有,则B没有,重复,没有被初始化。对文字的引用class不会触发类初始化。“静态块”是一个不正确的术语。它是“静态初始化块”。哪个没有运行。

使用其中一个final Object成员AB来同步,而不是class文字。

于 2017-02-01T16:23:14.147 回答
0

如果你真的将该代码编译成 JAR;并且那个 JAR 包含 B.class;那么这不可能发生。

唯一的选择是:您使用的 JAR 已损坏;或者它不包含您认为它应该包含的内容。

因此:验证您的 JAR。一定有什么地方不对劲。例如,用于jar tf jarfile.jar列出完整的内容;并检查 B.class 是否真的在。

于 2017-02-01T13:11:04.583 回答
0

类对象或元数据由类加载器在启动 Java 应用程序时加载。

由于以下原因,上面的代码可能最终出现在 java.lang.NoClassDefFoundError 中。

1> 上面的静态方法 init 是从 A 类的静态块中调用的。可能会发生 B 类在 A 类之前仍未加载,并且类加载器试图锁定 B 类的类对象(元数据)和找不到类的定义。

如果您在 A.class 上进行同步,它会起作用,因为类加载器具有它的类元引用

为了使用 B.class 类,您可能必须延迟调用 A 类中的 init 方法并允许类加载器加载类的元信息。请避免从任何静态初始化程序块调用 A 类中的 init() 方法。

于 2017-02-01T13:59:34.457 回答