1

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

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

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

线程“main”中的异常 java.lang.NoClassDefFoundError: objects/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(); }}
4

6 回答 6

6

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

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

于 2011-01-25T17:31:25.223 回答
3

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

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

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

于 2011-01-25T17:31:33.597 回答
1

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

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

于 2011-01-25T17:50:59.110 回答
0

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

于 2011-01-25T17:33:54.020 回答
0

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

那么JVM将运行以下代码 -

ISomeInterface object = Locator.LocateImplementation();

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

所以你的以下理解

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

不是真的有效。

于 2011-01-25T17:34:46.407 回答
0

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

public class Calbacks {
    public interface IBaseFragmentInterface {
        void NotifyMainActivity();
    }
}
于 2017-04-02T19:10:23.040 回答