Java - когда происходит java.lang.NoClassDefFoundError?

1

Представьте, что у меня есть класс под названием A и конструктор, который генерирует исключение типа B.

Если я сделаю A a = new A(); и мой путь к классам не содержит B, будет ли всегда возникать ошибка java.lang.NoClassDefFoundError? Или это будет только брошено, если конструктор действительно выбросил Исключение?

public class A{
   public A() throws B{
       if (...){
       } else {
          throw new B();
       } 
   }


}
  • 0
    Благодарю. Это то, что я подозревал.
  • 1
    @BackSlash ".. конструктор, который выдает исключение типа B. "?
Показать ещё 3 комментария
Теги:
exception
classloader

2 ответа

4
Лучший ответ

Да, NoClassDefFoundError всегда вызывается, когда загрузчик классов пытается загрузить класс, непосредственно ссылающийся в ваш код, и не может быть найден в пути к классу.

Если же вы попытаетесь загрузить этот класс динамически, например, используя Class.forName() ClassNotFoundException будет выброшено.

  • 0
    Это не ясно, хотя. Подпись метода является прямой ссылкой? Другими словами, будет ли A () всегда генерировать ClassNotFound, даже если исключение на самом деле не генерируется?
  • 1
    @DavidBrossard: Почему бы тебе просто не попробовать? Я сделал, это заняло всего две минуты. Да, исключение определения класса выдается, даже если A никогда не вызывает new B В моем случае я использовал аргумент: if (n == 0) { throw new B(); } но затем передается значение, которое не было 0 .
Показать ещё 3 комментария
1

НЕВЕРНЫЙ ОТВЕТ

Другой ответ правильный. Для возникновения ошибки не требуется создание экземпляра.


NoClassDefFoundError будет NoClassDefFoundError во время выполнения, когда вы попытаетесь создать экземпляр класса, который не может быть найден в пути к классам.

В вашем примере это будет только брошено, когда блок else будет выполнен.

Док есть: http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html

Брошено, если Java Virtual Machine или экземпляр ClassLoader пытается загрузить определение класса (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и определение класса не может быть найдено.

Определение класса поиска было выполнено, когда исполняемый класс был скомпилирован, но определение больше не может быть найдено.

  • 1
    «... когда вы пытаетесь создать экземпляр класса ...» Вам даже не нужно создавать его экземпляр. Имея конструктор A , который говорит, что выбрасывает B , достаточно, он фактически не должен это делать.
  • 0
    @TJCrowder кто-то должен отредактировать этот ответ, чтобы он был точным. Кавычка верна, а ключевое слово «как часть обычного вызова метода».
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню