Представьте, что у меня есть класс под названием A и конструктор, который генерирует исключение типа B.
Если я сделаю A a = new A();
и мой путь к классам не содержит B, будет ли всегда возникать ошибка java.lang.NoClassDefFoundError
? Или это будет только брошено, если конструктор действительно выбросил Исключение?
public class A{
public A() throws B{
if (...){
} else {
throw new B();
}
}
}
Да, NoClassDefFoundError
всегда вызывается, когда загрузчик классов пытается загрузить класс, непосредственно ссылающийся в ваш код, и не может быть найден в пути к классу.
Если же вы попытаетесь загрузить этот класс динамически, например, используя Class.forName()
ClassNotFoundException
будет выброшено.
A
никогда не вызывает new B
В моем случае я использовал аргумент: if (n == 0) { throw new B(); }
но затем передается значение, которое не было 0
.
НЕВЕРНЫЙ ОТВЕТ
Другой ответ правильный. Для возникновения ошибки не требуется создание экземпляра.
NoClassDefFoundError
будет NoClassDefFoundError
во время выполнения, когда вы попытаетесь создать экземпляр класса, который не может быть найден в пути к классам.
В вашем примере это будет только брошено, когда блок else
будет выполнен.
Док есть: http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html
Брошено, если Java Virtual Machine или экземпляр ClassLoader пытается загрузить определение класса (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и определение класса не может быть найдено.
Определение класса поиска было выполнено, когда исполняемый класс был скомпилирован, но определение больше не может быть найдено.
A
, который говорит, что выбрасывает B
, достаточно, он фактически не должен это делать.