的NoClassDefFoundError

时间:2011-01-25 17:26:02

标签: java interface noclassdeffounderror

我遇到了抛出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(); }}

6 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

如果您遇到打包/类路径问题,这样就会发生这种情况,这样您的运行时环境就无法反映构建时的情况。

如果要从IDE启动此功能,请确保不要忽略任何错误并启动。有些类不会以这种方式生成。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

JVM将运行以下代码 -

ISomeInterface object = Locator.LocateImplementation();

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

所以你的理解

  

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

不是真的有效。

答案 5 :(得分:0)

任何接口必须在类

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