Каковы причины и каковы различия между NoClassDefFoundError и ClassNotFoundException?

371

В чем разница между NoClassDefFoundErrorи ClassNotFoundException?

Что заставляет их быть брошенными? Как они могут быть решены?

Я часто сталкиваюсь с этими throwables при изменении существующего кода, чтобы включить новые файлы JAR. Я ударил их как на стороне клиента, так и на стороне сервера для Java-приложения, распространяемого через веб-запуск.

Возможные причины, с которыми я столкнулся:

  1. пакеты не включены build.xmlдля клиентской части кода
  2. путь к классу во время выполнения отсутствует для новых банок, которые мы используем
  3. версия конфликтует с предыдущей флягой

Когда я сталкиваюсь с этим сегодня, я использую метод «след и ошибка», чтобы все заработало. Мне нужно больше ясности и понимания.

krisp
источник
Я часто нахожу запуск JVM с помощью -verbose(например -verbose:class -verbose:jni) справок - но ниже в своем ответе моги сообщают, что это не дает никакой дополнительной полезной информации :(
PJTraill

Ответы:

388

Отличие от спецификаций API Java заключается в следующем.

Для ClassNotFoundException:

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

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

но определение класса с указанным именем не найдено.

Для NoClassDefFoundError:

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

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

Итак, похоже, что это NoClassDefFoundErrorпроисходит, когда исходный код был успешно скомпилирован, но во время выполнения необходимые classфайлы не были найдены. Это может произойти при распространении или создании файлов JAR, где не все необходимые classфайлы были включены.

Что касается ClassNotFoundException , кажется, что это может произойти из-за попыток сделать рефлексивные вызовы к классам во время выполнения, но классов, которые пытается вызвать программа, не существует.

Разница между ними заключается в том, что один - это Errorа другой - Exception. С NoClassDefFoundErrorявляется Errorи это происходит из-за виртуальной машины Java, имеющей проблемы с поиском класса, который она ожидала найти. Программа, которая должна была работать во время компиляции, не может быть запущена из-за того, что classфайлы не найдены или не совпадает с той, которая была создана или обнаружена во время компиляции. Это довольно критическая ошибка, так как JVM не может инициировать программу.

С другой стороны, ClassNotFoundExceptionэто Exception, так что это несколько ожидаемо, и это то, что можно восстановить. Использование рефлексии может быть подвержено ошибкам (так как есть некоторые ожидания, что все может пойти не так, как ожидалось. Нет проверки во время компиляции, чтобы увидеть, что все необходимые классы существуют, поэтому любые проблемы с поиском нужных классов появятся во время выполнения ,

coobird
источник
53
NoClassDefFoundErrorобычно возникает, когда возникает проблема (исключение выдается) с инициализацией класса статическим блоком или статическими полями, поэтому класс не может быть успешно инициализирован
Даганг
7
upvote. один - Errorа другой - Exception. :)
Рави
83

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

Люди часто имеют тенденцию путать java.lang.NoClassDefFoundErrorс тем, java.lang.ClassNotFoundExceptionно есть важное различие. Например, исключение (ошибка действительно, так java.lang.NoClassDefFoundErrorкак это подкласс java.lang.Error), например

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

не означает, что класс ActiveMQConnectionFactory отсутствует в CLASSPATH. На самом деле это совсем наоборот. Это означает, что класс ActiveMQConnectionFactory был найден ClassLoader, однако при попытке загрузить класс возникла ошибка при чтении определения класса. Обычно это происходит, когда у рассматриваемого класса есть статические блоки или члены, которые используют класс, который не найден ClassLoader. Поэтому, чтобы найти виновника, просмотрите источник рассматриваемого класса (в данном случае ActiveMQConnectionFactory) и найдите код, используя статические блоки или статические члены. Если у вас нет доступа к источнику, просто декомпилируйте его, используя JAD.

Рассматривая код, скажем, вы нашли строку кода, как показано ниже, убедитесь, что класс SomeClass входит в ваш CLASSPATH.

private static SomeClass foo = new SomeClass();

Совет: Чтобы узнать, к какому jar принадлежит класс, вы можете использовать веб-сайт jarFinder. Это позволяет вам указать имя класса с помощью подстановочных знаков, и он ищет класс в своей базе данных jar. jarhoo позволяет вам делать то же самое, но его больше нельзя использовать.

Если вы хотите определить, к какому jar-классу принадлежит класс, в локальном пути, вы можете использовать утилиту, например jarscan ( http://www.inetfeedback.com/jarscan/ ). Вы просто указываете класс, который хотите найти, и путь к корневому каталогу, в котором вы хотите начать поиск класса в jar-файлах и zip-файлах.

Санджив Дживан
источник
9
Забавно, что именно за правильный ответ проголосовал последний. (Даже -1, прежде чем я проголосовал). ClassNotFoundException означает, что CL не видит файл .class. NoClassDefFoundError означает, что файл .class не загружен (возможно, ошибка JNI).
user43685
1
Разве этот ответ не противоречит форме ответа coobird?
Зардошть
Я попробовал подобный пример статического блока. В моем классе Class1 есть статическая переменная "private static B foo = new B ();" После компиляции я удалил файл B.class из папки bin. Теперь из метода Main третьего класса, когда я создаю объект Class1. Ошибка указана как: ieclass упоминается в статическом блоке, а не во внешнем классе. Так что это противоречит этому ответу.
Каушик Леле
+1 за разъяснения относительно «не означает, что класс ActiveMQConnectionFactory отсутствует в CLASSPATH»
Акила
35

NoClassDefFoundErrorэто ошибка связи в принципе. Это происходит, когда вы пытаетесь создать экземпляр объекта (статически с «новым»), и не обнаруживается, когда это было во время компиляции.

ClassNotFoundExceptionявляется более общим и является исключением во время выполнения, когда вы пытаетесь использовать класс, который не существует. Например, у вас есть параметр в функции, принимающий интерфейс, и кто-то передает класс, который реализует этот интерфейс, но у вас нет доступа к классу. Он также охватывает случай динамической загрузки класса, такой как использование loadClass()или Class.forName().

Клетус
источник
29

NoClassDefFoundError (NCDFE) происходит, когда ваш код выполняет «new Y ()» и не может найти класс Y.

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

Если это произойдет, JVM запомнит результат загрузки X (NCDFE) и будет просто выдавать новый NCDFE каждый раз, когда вы запрашиваете Y, не сообщая вам, почему:

класс {
  статический класс b {}
  public static void main (String args []) {
    System.out.println («Первая попытка нового b ():»);
    try {new b (); } catch (Throwable t) {t.printStackTrace ();}
    System.out.println ("\ nВторичная попытка нового b ():");
    try {new b (); } catch (Throwable t) {t.printStackTrace ();}
  }
}

сохраните это как a.java где-нибудь

Код просто пытается дважды создать новый класс «b», кроме этого, в нем нет ошибок и он ничего не делает.

Скомпилируйте код с помощью javac a.java, затем запустите, вызвав java -cp . a- он должен просто распечатать две строки текста, и он должен работать без ошибок.

Затем удалите файл «$ b.class» (или заполните его мусором, или скопируйте поверх него a.class), чтобы имитировать отсутствующий или поврежденный класс. Вот что происходит:

Первая попытка нового b ():
java.lang.NoClassDefFoundError: a $ b
    в a.main (a.java:5)
Вызывается: java.lang.ClassNotFoundException: a $ b
    на java.net.URLClassLoader $ 1.run (URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged (собственный метод)
    на java.net.URLClassLoader.findClass (URLClassLoader.java:188)
    в java.lang.ClassLoader.loadClass (ClassLoader.java:307)
    at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
    в java.lang.ClassLoader.loadClass (ClassLoader.java:252)
    в java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
    ... 1 более

Вторая попытка нового b ():
java.lang.NoClassDefFoundError: a $ b
    в домене (a.java:7)

Первый вызов приводит к исключению ClassNotFoundException (генерируемому загрузчиком классов, когда он не может найти класс), которое должно быть заключено в непроверенную NoClassDefFoundError, так как код в вопросе ( new b()) должен просто работать.

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

Поэтому, если вы когда-нибудь увидите NCDFE без основной причины, вам нужно посмотреть, сможете ли вы отследить, когда класс был загружен в первый раз, чтобы найти причину ошибки.

mogsie
источник
Как насчет запуска JVM с -verboseили какой-либо подобной опции в зависимости от конкретной JVM? Возможно -verbose:class, может быть, -verbose:class:jniесли использовать JNI, но я не уверен в синтаксисе. Если это полезно, возможно, вы могли бы показать результаты.
PJTraill
Ни, -verbose:classни -verbose:jniдать никакого дополнительного вывода, относящегося к отсутствующему классу.
mogsie
1
Спасибо за попытку, даже если результат разочаровывает. (PS С тех пор я обнаружил, что -verbose:class:jniэто неправильно: нужно указать две отдельные опции:. -verbose:class -verbose:jni)
PJTraill
2
Последнее предложение * 1 000 000: так что если вы когда-нибудь увидите NCDFE без основной причины, вам нужно посмотреть, сможете ли вы вернуться к самому первому моменту загрузки класса, чтобы найти причину ошибки.
Батвад
20

С http://www.javaroots.com/2013/02/classnotfoundexception-vs.html :

ClassNotFoundException: происходит, когда загрузчик классов не может найти требуемый класс в пути к классам. Итак, в основном вы должны проверить путь к классу и добавить класс в путь к классам.

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

Пример :

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

Теперь после компиляции обоих классов, если вы удалите файл Test1.class и запустите класс Test, он выдаст

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

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

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

KingFeming
источник
Как насчет запуска JVM с -verboseили какой-либо подобной опции в зависимости от конкретной JVM? Возможно -verbose:class, может быть, -verbose:class:jniесли использовать JNI, но я не уверен в синтаксисе.
PJTraill
-verbose:class:jniэто неправильно, но вы можете передать два отдельных варианта: -verbose:class -verbose:jni.
PJTraill
15

Какова причина получения каждого из них и какой-либо мыслительный процесс о том, как бороться с такими ошибками?

Они тесно связаны. A ClassNotFoundExceptionгенерируется, когда Java отправляется на поиск определенного класса по имени и не может успешно его загрузить. A NoClassDefFoundErrorвыдается, когда Java ищет класс, который был связан с каким-то существующим кодом, но не может найти его по той или иной причине (например, неверный путь к классу, неправильная версия Java, неправильная версия библиотеки) и является полностью фатальным поскольку это указывает на то, что что-то пошло не так.

Если у вас есть фон C, CNFE - это как сбой в dlopen()/, dlsym()а NCDFE - проблема с компоновщиком; во втором случае соответствующие файлы классов никогда не должны были быть скомпилированы в конфигурации, которую вы пытаетесь использовать.

Donal Fellows
источник
11

Пример № 1:

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

Если com/example/Class1не существует ни в одном из путей к классам, он выбрасывает ClassNotFoundException.

Пример № 2:

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

Если com/example/Class2существовал во время компиляции B, но не найден во время выполнения, он выбрасывает NoClassDefFoundError.

Оба являются исключениями времени выполнения.

Динеш
источник
9

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

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

С другой стороны, выбрасывается NoClassDefFoundError

  • когда фактическое физическое представление класса - файл .class недоступен,
  • или класс уже был загружен в другой загрузчик классов (обычно родительский загрузчик классов загружал бы класс и, следовательно, класс не может быть загружен снова),
  • или если найдено несовместимое определение класса - имя в файле класса не соответствует запрошенному имени,
  • или (что наиболее важно), если зависимый класс не может быть найден и загружен. В этом случае класс, на который имеется прямая ссылка, мог быть найден и загружен, но зависимый класс недоступен или не может быть загружен. Это сценарий, в котором класс с прямой ссылкой может быть загружен с помощью Class.forName или эквивалентных методов. Это указывает на сбой в связи.

Короче говоря, NoClassDefFoundError обычно генерируется в операторах new () или вызовах методов, которые загружают ранее отсутствующий класс (в отличие от загрузки классов на основе строк для ClassNotFoundException), когда загрузчик классов не может найти или загрузить определение класса ( с).

В конечном счете, реализация ClassLoader создает экземпляр ClassNotFoundException, когда он не может загрузить класс. Большинство пользовательских реализаций загрузчика классов выполняют это, поскольку они расширяют URLClassLoader. Обычно загрузчики классов явно не генерируют NoClassDefFoundError ни в одной из реализаций метода - это исключение обычно генерируется из JVM в компиляторе HotSpot, а не самим загрузчиком классов.

Винит Рейнольдс
источник
Upvote за упоминание «имя в файле класса не соответствует запрошенному имени». Это довольно распространенная причина.
Маркиз Лорн
8

Разница между ClassNotFoundException и NoClassDefFoundError

введите описание изображения здесь

Лавакуш Курми
источник
Не кристально чистый. «Не обновлено в classpath» является расплывчатым / неточным. Это примерно либо JAR не в настоящее время в пути к классам, или неправильная версии ЕАО , находящемуся на пути к классам. И орфографические ошибки. И (вздыхая), так как вы опубликовали свою информацию в виде прикольной графики, мы не можем это исправить.
Стивен С.
8

По самим именам мы можем легко идентифицировать одно из, Exceptionа другое - из Error.

Исключение: исключения возникают во время выполнения программы. Программист может обработать это исключение, попробовав catch block. У нас есть два типа исключений. Проверено исключение, которое выдает во время компиляции. Исключения во время выполнения, которые генерируются во время выполнения, эти исключения обычно происходят из-за плохого программирования.

Ошибка: это вовсе не исключения, это выходит за рамки возможностей программиста. Эти ошибки обычно генерируются JVM.


введите описание изображения здесь источник изображения

Разница:

ClassNotFoundException:

  • Загрузчика классов не в состоянии проверить в класс байтовый код , который мы упоминаем в фазе Link от класса нагрузки подсистемы мы получаем ClassNotFoundException.
  • ClassNotFoundExceptionэто проверенное исключение, полученное непосредственно из java.lang.Exceptionкласса, и вам необходимо обеспечить явную обработку для него
  • ClassNotFoundExceptionпоявляется, когда происходит явная загрузка класса путем предоставления имени класса во время выполнения с использованием ClassLoader.loadClass (), Class.forName () и ClassLoader.findSystemClass ().

NoClassDefFoundError:

  • Загрузчика классов не в разрешении ссылок одного класса в фазе Link от класса нагрузки подсистемы мы получаем NoClassDefFoundError.
  • NoClassDefFoundErrorОшибка, полученная из LinkageErrorкласса, которая используется для указания случаев ошибки, когда класс зависит от какого-то другого класса и этот класс несовместимо изменился после компиляции.
  • NoClassDefFoundErrorявляется результатом неявной загрузки класса из-за вызова метода из этого класса или любой переменной доступа.

сходства:

  • И то, NoClassDefFoundErrorи другое ClassNotFoundExceptionсвязано с недоступностью класса во время выполнения.
  • Оба ClassNotFoundExceptionи NoClassDefFoundErrorсвязаны с Java classpath.
Premraj
источник
3

Учитывая действия sussystem загрузчика класса:

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

Эта статья очень помогла мне понять разницу: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

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

Если Виртуальная машина Java когда-либо пытается загрузить класс C во время проверки (§5.4.1) или разрешения (§5.4.3) (но не инициализации (§5.5)), и загрузчик класса, который используется, чтобы инициировать загрузку C генерирует экземпляр ClassNotFoundException , затем виртуальная машина Java должна выбросить экземпляр NoClassDefFoundError , причиной которого является экземпляр ClassNotFoundException .

Таким образом, ClassNotFoundException является основной причиной NoClassDefFoundError .
А NoClassDefFoundError - это особый случай ошибки загрузки типа, которая возникает на этапе связывания .

Антон Щастный
источник
2

Добавьте одну возможную причину на практике:

  • ClassNotFoundException: как сказал Клетус, вы используете интерфейс, в то время как унаследованный класс интерфейса не находится в пути к классам. Например, шаблон сервис-провайдера (или сервис-локатор ) пытается найти какой-то несуществующий класс
  • NoClassDefFoundError: данный класс найден, а зависимость данного класса не найдена

На практике ошибка может быть выброшена без вывода сообщений , например, вы отправляете задачу таймера, а в задаче таймера она выдает ошибку , в то время как в большинстве случаев ваша программа только перехватывает исключение . Затем основной цикл таймера заканчивается без какой-либо информации. Ошибка, аналогичная NoClassDefFoundError, - это ExceptionInInitializerError , когда ваш статический инициализатор или инициализатор для статической переменной выдает исключение.

Leef
источник
1

ClassNotFoundException - это проверенное исключение, которое возникает, когда мы сообщаем JVM загружать класс по его строковому имени, используя методы Class.forName () или ClassLoader.findSystemClass () или ClassLoader.loadClass (), и упомянутый класс не найден в classpath.

В большинстве случаев это исключение возникает при попытке запустить приложение без обновления пути к классу необходимыми файлами JAR. Например, вы, возможно, видели это исключение при выполнении кода JDBC для подключения к вашей базе данных, т.е. MySQL, но ваш путь к классам не имеет JAR для него.

Ошибка NoClassDefFoundError возникает, когда JVM пытается загрузить определенный класс, который является частью выполнения вашего кода (как часть обычного вызова метода или как часть создания экземпляра с использованием нового ключевого слова), и этот класс отсутствует в вашем пути к классам, но был присутствует во время компиляции, потому что для выполнения вашей программы вам нужно скомпилировать ее, и если вы пытаетесь использовать класс, которого нет, компилятор вызовет ошибку компиляции.

Ниже приводится краткое описание

введите описание изображения здесь

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

Нареш Джоши
источник
0

Я напоминаю себе следующее снова и снова, когда мне нужно обновить

ClassNotFoundException

Классовая иерархия

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Во время отладки

  1. Необходимая банка, класс отсутствует в пути к классам.
  2. Убедитесь, что все необходимые банки находятся в classpath из jvm.

NoClassDefFoundError

Классовая иерархия

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Во время отладки

  1. Проблема с динамической загрузкой класса, которая была правильно скомпилирована
  2. Проблема со статическими блоками, конструкторами, методами init () зависимого класса и фактической ошибкой оборачивается несколькими слоями [особенно когда вы используете spring, hibernate оборачивается фактическим исключением, и вы получите NoClassDefError]
  3. Когда вы сталкиваетесь с «ClassNotFoundException» под статическим блоком зависимого класса
  4. Проблема с версиями класса. Это происходит, когда у вас есть две версии v1, v2 одного и того же класса в разных jar / пакетах, которые были успешно скомпилированы с использованием v1, а v2 загружается во время выполнения, в котором нет соответствующих методов / vars, и вы увидите это исключение. [Однажды я решил эту проблему, удалив дубликат связанного с log4j класса под несколькими банками, которые появились в classpath]
Санкарганеш Ишваран
источник
-1

ClassNotFoundException и NoClassDefFoundError происходят, когда определенный класс не найден во время выполнения. Однако они происходят в разных сценариях.

ClassNotFoundException - это исключение, которое возникает, когда вы пытаетесь загрузить класс во время выполнения с помощью методов Class.forName () или loadClass (), и упомянутые классы не найдены в пути к классам.

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }



    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

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

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

Когда вы скомпилируете вышеуказанную программу, будут сгенерированы два файла .class. Один из них - A.class, а другой - B.class. Если вы удалите файл A.class и запустите файл B.class, Java Runtime System выдаст NoClassDefFoundError, как показано ниже:

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Нирадж Гахлават
источник