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