想象一下,我有一个名为A的类和一个抛出类型B异常的构造函数。
如果我A a = new A();
且我的类路径不包含B,是否会抛出java.lang.NoClassDefFoundError
错误?或者只有在构造函数实际抛出异常时才抛出它?
public class A{
public A() throws B{
if (...){
} else {
throw new B();
}
}
}
答案 0 :(得分:4)
是的,当类加载器尝试加载代码中直接引用的类并且在类路径中找不到时,总是抛出NoClassDefFoundError
。
但是,如果您尝试动态加载此类,则会抛出使用Class.forName()
ClassNotFoundException
的内容。
答案 1 :(得分:1)
错误的回答
其他答案是正确的。抛出Error时不需要进行实例化。
NoClassDefFoundError
将在运行时抛出。
在您的示例中,只有在执行else
块时才会抛出它。
Doc就在那里:http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分),则抛出该类,并且没有类的定义可以被发现。
在编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。