【问题标题】:NoClassDefFoundErrorNoClassDefFoundError
【发布时间】:2011-01-25 17:26:01
【问题描述】:

我遇到了抛出 NoClasDefFoundError 的问题。这让我很困惑,因为我正在使用接口,并且不应该有可用的类定义。我已经阅读了一些指向 Classpath 的帖子,但我不认为这是这里的问题(尽管我可能错了)。我正在使用 NetBeans 6.9.1 IDE。

我创建了一个示例设置来重现该问题。四个项目:接口、对象、定位器和消费者。您将在下面找到实现。

在运行时,消费者抱怨缺少 SomeObject 实现,因为它正在接受接口,所以它不应该意识到这一点。

线程“main”中的异常 java.lang.NoClassDefFoundError: 对象/SomeObject

我错过了什么?

package interfaces;
public interface ISomeInterface { }

package objects;
import interfaces.ISomeInterface;
public class SomeObject implements ISomeInterface{ }

package locator;
import interfaces.ISomeInterface;
import objects.SomeObject;
public class Locator { public static ISomeInterface LocateImplementation() { return new SomeObject(); }}

package consumer;
import interfaces.ISomeInterface;
import locator.Locator;
public class Main { public static void main(String[] args) { ISomeInterface object = Locator.LocateImplementation(); }}

【问题讨论】:

  • 感谢大家的精彩回答!!毕竟这是一个类路径问题。我不知道消费者也需要查看“对象”,尽管事实上“定位器”将它们放在它的类路径中。

标签: java interface noclassdeffounderror


【解决方案1】:

您可以使用接口获取 NoClassDefFoundError 异常,就像使用类一样。将异常名称中的“Class”视为编译类或接口生成的 .class 文件,而不是 Java 类。

这是说类/接口 objects.SomeObject 在您的类路径中不可见。检查该 .class 文件的位置并确保它在您的类路径中 - 如果您确定它在那里,请给我们一些屏幕截图或可能有助于调试问题的东西。

【讨论】:

    【解决方案2】:

    将 NoClassDefFoundError 视为运行时链接问题。 JRE 加载了一个类(或接口)并引用了另一个类(或接口),但找不到该引用的类。

    如果您有打包/类路径问题,以至于您的运行时环境无法反映构建时的情况,这是发生这种情况的唯一方法。

    如果您从 IDE 启动它,请确保您没有忽略任何错误并启动。某些类不会以这种方式生成。

    【讨论】:

    • 这是我的问题:引用的引用不在我的类路径中。
    【解决方案3】:

    通常我遇到这些问题不是在缺少类时,而是在静态初始化程序中出现错误时。

    尝试在调试器中运行您的代码,并将异常断点设置为在抛出任何异常时中断,无论是否捕获。我敢打赌,由于某种原因,静态初始化程序中有一个未捕获的异常。

    【讨论】:

      【解决方案4】:

      在 locateImplementation() 方法中,您返回“new SomeObject()”, JVM在调用时需要有它的定义。我认为它丢失了。

      【讨论】:

        【解决方案5】:

        您应该检查您的 SomeObject 类是否在类路径中,因为 -

        那么 JVM 将运行以下代码 -

        ISomeInterface object = Locator.LocateImplementation();
        

        当它这样做时,它将调用 Locator.LocateImplementation()。此代码在内部尝试实例化您在类路径中找不到的 SomeObject 类。

        所以你的以下理解

        这让我很困惑,因为我正在使用 接口,没有类定义 应该可用。

        不是真的有效。

        【讨论】:

          【解决方案6】:

          任何接口都必须在类中声明

          public class Calbacks {
              public interface IBaseFragmentInterface {
                  void NotifyMainActivity();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-10-19
            • 2016-02-10
            • 1970-01-01
            • 2012-09-18
            • 2012-11-11
            • 2015-11-12
            • 2023-04-04
            • 2019-02-24
            • 2021-06-02
            相关资源
            最近更新 更多