В чем разница между ClassNotFoundException и NoClassDefFoundError и не удалось найти или загрузить основной класс XYZ? - PullRequest
4 голосов
/ 01 августа 2020

Я исследовал несколько сайтов, но не мог понять разницу между ними. Я хотел бы знать точную разницу между тремя.

Ответы [ 4 ]

3 голосов
/ 01 августа 2020

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

(Источник: https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/NoClassDefFoundError.html )

A ClassNotFoundException выдается, когда приложение пытается загрузить класс через его строковое имя, используя:

  1. Метод forName в классе Class.
  2. Метод findSystemClass в классе ClassLoader.
  3. Метод loadClass в классе ClassLoader.

(Источник: https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/ClassNotFoundException.html)

Ошибка message Couldn't find or load main class XYZ, означает много вещей:

  1. Вы указали неправильный класс (Typo)
  2. Класс в указанном файле классов находится (не) в пакете. (Как java c, но класс находится в пакете ab, поэтому команда должна быть java a.b.c)

Дополнительная информация / причины: { ссылка }

1 голос
/ 01 августа 2020

NoClassDefFoundError - - это a ошибка времени выполнения , выдается, когда определение класса (которым является .class файл) не может быть найдено во время выполнения.

  • Представьте, что вы скомпилировали класс A.java вместе с другими файлами вашего проекта; однако позже вы удалили скомпилированный файл A.class. Итак, компиляция прошла нормально, но фактический байт-код определения класса отсутствует, поскольку A.class был удален.

ClassNotFoundException - is a проверенное исключение , выдается, когда ваше приложение пытается загрузить класс через его имя String, но класс недоступен по пути к классам.

  • Примером может быть вызов метода Class.forName("com.mysql.jdbc.driver"); в вашем кода, однако в вашем проекте нет com.mysql.jdbc.driver.

Couldn't find or load main class XYZ - это ошибка, указывающая на то, что класс, который вы инструктируете JVM для запуска, не содержат метод должен иметь точку входа public static void main(String[] args), и причины для этого могут быть разными, в основном одна из этого списка:

  • вы не предоставляете правильную полностью квалифицированную Имя вашего основного класса;
  • основной метод не определен с правильной подписью;
  • вы испортили упаковку / вы не запускаете программу с super.sub.grandchild.MainClass именем;
  • у вас есть .class постфикс после вашего имени класса, который вы должны удалить.
1 голос
/ 01 августа 2020

NoClassDefFoundError

Это происходит, когда JVM или ClassLoader пытается загрузить класс (как часть обычного вызова метода или как часть создания нового экземпляра с использованием new выражение), но его нельзя найти, пока он существовал, когда выполняемый в данный момент класс был скомпилирован.

ClassNotFoundException

Как упоминалось в документации, оно выдается, когда приложение пытается загрузить класс через его строковое имя, используя:

  1. Метод forName в классе Class.
  2. Метод findSystemClass в классе ClassLoader.
  3. Метод loadClass в классе ClassLoader.

Это означает, что JVM неизвестно, существовал ли класс (который должен быть загружен), когда текущий выполняемый класс был скомпилирован.

1 голос
/ 01 августа 2020

И ClassNotFoundException, и NoClassDefFoundError вызываются, когда JVM не может загрузить конкретный файл, но их причина отличается.

Java время выполнения выдает ClassNotFoundException при попытке загрузить класс только во время выполнения, а имя было предоставлено во время выполнения. В случае NoClassDefFoundError класс присутствовал во время компиляции, но Java среда выполнения не смогла найти его в Java classpath во время выполнения.

Couldn't find or load main class сообщение об ошибке может быть вызвано различными причины , это также может быть вызвано ClassNotFoundException или NoClassDefFoundError.

Error: Could not find or load main class ClassName.class
Caused by: java.lang.ClassNotFoundException: ClassName.class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...