gpt4 book ai didi

java.lang.NoClassDefFoundError 仅在特定条件下

转载 作者:行者123 更新时间:2023-11-29 04:48:24 25 4
gpt4 key购买 nike

我的问题是,当 B 类尝试使用 A.check() 时,我的执行因 java.lang.NoClassDefFoundError 而停止。

这是我的类配置。注意:这些类在同一个包中,我已经检查过 A.class 文件是否放置在它应该放置的位置。

public class A{
// vars

// declare some public method

public synchronized static boolean check(){
//do stuff, log some info and return boolean
}
}

public class B implements Runnable{
public void run() {
A.check();
}
}

这是我的堆栈跟踪:

java.lang.NoClassDefFoundError: org/mypackage/A at org/mypackage.B.run() at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: org/mypackage.B at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)

这个项目真的很大,在这次调用之前多次使用类 A 没有任何问题,所以我认为这与类路径无关。请注意,这是应关闭所有内容的软件最后一次调用的一部分。

此外,我有两个 maven 目标:第一个可以毫无问题地执行有问题的代码,而第二个每次都会出现此错误。

最佳答案

所以我已经解决了我的问题,我将解决方案发布在这里,也许对其他人有用。

首先报错:java.lang.NoClassDefFoundError这个错误与 ClassNotFoundException 确实不同,这是我浪费了很多时间的地方。

当 JVM 无法在运行时找到在编译时可用的特定类时,会引发 Java 中的 NoClassDefFoundError。例如,如果我们有一个来自访问类的任何成员的类的方法调用,并且该类在运行时不可用,那么 JVM 将抛出 NoClassDefFoundError。重要的是要理解这与 ClassNotFoundException 不同,ClassNotFoundException 仅在运行时尝试加载类时出现,并且名称是在运行时提供的,而不是在编译时提供的。许多 Java 开发人员将这两个错误混为一谈并感到困惑。我在这里 quote我用过的一个非常有用的博客。

因此,如果某个类在编译时存在但在运行时在 java 类路径中不可用,则以更短的方式出现 NoClassDefFoundError。

但即使有了这些信息,问题仍然存在,直到我发现了谜团:可以将类置于可以编译但在运行时无法定位的状态的原因之一是,如果静态初始化失败(例如,在我的类里面,我将一个静态变量实例化得很糟糕。

因此,如果您的类中有静态变量,请记住检查您的初始化阶段,这可能是您的 java.lang.NoClassDefFoundError 的原因。

顺便说一句,我不明白为什么这种错误没有引发一些更有意义的错误,例如 java.lang.ExceptionInInitializerError 或类似的错误。

关于java.lang.NoClassDefFoundError 仅在特定条件下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36329081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com