Які причини та які відмінності між NoClassDefFoundError та ClassNotFoundException?


371

У чому різниця між NoClassDefFoundErrorі ClassNotFoundException?

Що змушує їх кидатись? Як їх можна вирішити?

Я часто стикаюся з цими перекидними кодами під час зміни існуючого коду для включення нових файлів jar. Я потрапив на них як на клієнтській, так і на серверній частині програми Java, що поширюється через webstart.

Можливі причини, з якими я стикався:

  1. пакети, не включені build.xmlдо клієнтської частини коду
  2. Класс виконання часу відсутній для нових банок, які ми використовуємо
  3. версія суперечить попередній банці

Коли я стикаюся з цими сьогодні, я використовую підхід із помилки та помилки, щоб налагодити роботу. Мені потрібно більше ясності та розуміння.


Мені часто здається, що запуск JVM з -verbose(наприклад -verbose:class -verbose:jni) допомагає - але mogsie повідомляє нижче своєї відповіді, що це не дає додаткової корисної інформації :(
PJTraill

Відповіді:


388

Відмінність специфікацій Java API полягає в наступному.

Для ClassNotFoundException:

Викинуто, коли програма намагається завантажити в клас через його ім'я рядка, використовуючи:

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

але визначення класу із вказаною назвою не вдалося знайти.

Для NoClassDefFoundError:

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

Визначення класу, яке шукали, існувало при складанні поточного класу, який виконується, але визначення його більше не можна знайти.

Отже, виявляється, що NoClassDefFoundErrorвідбувається, коли джерело було успішно скомпільовано, але під час виконання потрібні classфайли не були знайдені. Це може статися при розповсюдженні або виробництві файлів JAR, де не classбули включені всі необхідні файли.

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

Різниця між ними полягає в тому, що один є an, Errorа другий є an Exception. З NoClassDefFoundErrorце є, Errorі це виникає у віртуальної машини Java, які мають проблеми з пошуком класу, який він очікував знайти. Програма, яка, як очікується, працювала в час компіляції, не може запуститися через те, що classфайли не знайдені або не є такими, які були створені або виникли під час компіляції. Це досить критична помилка, оскільки програма не може бути ініційована JVM.

З іншого боку, " ClassNotFoundExceptionє" Exception, тому дещо очікується, і це щось, що підлягає відновленню. Використовувати відображення може бути помилковим (оскільки є певні очікування, що все може не піти так, як очікувалося. Не існує перевірки часу компіляції, щоб побачити, що існують усі необхідні класи, тому будь-які проблеми з пошуком потрібних класів з’являться під час виконання .


53
NoClassDefFoundErrorзазвичай виникає, коли виникає проблема (викинуто виняток) із статичним блоком або ініціалізацією статичних полів класу, тому клас не може бути ініціалізований успішно.
Даган

7
піднести один - an, Errorа другий - an Exception. :)
Раві

83

ClassNotFoundException викидається, коли звітний клас не знайде ClassLoader. Зазвичай це означає, що клас CLASSPATH відсутній. Це також може означати, що відповідний клас намагається завантажити з іншого класу, який був завантажений у батьківський завантажувач, а отже, клас з дочірнього завантажувача не видно. Іноді це трапляється під час роботи в більш складних середовищах, таких як App Server (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. Це дозволяє вказати ім'я класу за допомогою макетів, і він шукає клас у своїй базі даних про банки. jarhoo дозволяє зробити те саме, але більше не вільне у використанні.

Якщо ви хочете знайти, до якої jar належить клас у локальному шляху, ви можете скористатися утилітою на зразок jarscan ( http://www.inetfeedback.com/jarscan/ ). Ви просто вкажіть клас, який ви хочете знайти, і шлях до кореневого каталогу, де ви хочете, щоб він почав шукати клас у банках та поштових файлах.


9
Мені смішно, що саме цю правильну відповідь проголосував останній. (Ще -1 до того, як я проголосував). ClassNotFoundException означає, що CL не бачить .class-файл. NoClassDefFoundError означає, що файл .class там не завантажується (можливо, помилка JNI).
користувач43685

1
Хіба ця відповідь не суперечить формі відповіді кобрида?
zardosht

Я спробував подібний приклад блоку Static. Мій клас Class1 має статичну змінну "приватний статичний B foo = новий B ();" Після компіляції я видалив файл B.class із папки bin. Тепер з основного методу третього класу, коли я створю об’єкт Class1. Rror є таємницею: -------- "Виняток у потоці" main "java.lang.NoClassDefFoundError: spring / B" ........ Отже, він точно вказує, який клас він не знайшов ieclass посилається в статичний блок, а не на зовнішній клас. Отже, це суперечить цій відповіді.
Каушик Леле

+1 для роз'яснення щодо "не означає, що клас ActiveMQConnectionFactory не в CLASSPATH"
akila

35

NoClassDefFoundErrorв основному є помилкою зв’язку. Це відбувається, коли ви намагаєтеся інстанціювати об'єкт (статично з "новим"), і його не знайдено, коли він був під час компіляції.

ClassNotFoundExceptionє загальнішим і є винятком під час виконання класу, який не існує. Наприклад, у вас параметр у функції приймає інтерфейс, і хтось переходить до класу, який реалізує цей інтерфейс, але у вас немає доступу до класу. Він також охоплює випадок завантаження динамічного класу, наприклад використання loadClass()або Class.forName().


29

NoClassDefFoundError (NCDFE) трапляється, коли ваш код запускає "новий Y ()" і він не може знайти клас Y.

Це може бути просто те, що Y відсутній у вашому завантажувачі класів, як це пропонують інші коментарі, але може бути, що клас Y не підписаний або має недійсну підпис, або що Y завантажений іншим завантажувачем класів, який не видно для вашого коду , або навіть те, що Y залежить від Z, який не вдалося завантажити з жодної з перерахованих вище причин.

Якщо це станеться, то JVM запам’ятає результат завантаження X (NCDFE), і він буде просто кидати новий NCDFE кожен раз, коли ви попросите Y, не повідомляючи, чому:

клас {
  статичний клас b {}
  public static void main (String args []) {
    System.out.println ("Перша спроба нового b ():");
    спробуйте {new b (); } улов (Throwable t) {t.printStackTrace ();}
    System.out.println ("\ nДруга спроба нового b ():");
    спробуйте {new b (); } улов (Throwable t) {t.printStackTrace ();}
  }
}

збережіть це як-небудь a.java десь

Код просто намагається інстанціювати новий клас "b" двічі, крім цього він не має жодних помилок і нічого не робить.

Складіть код із javac a.java, а потім запустіть a шляхом виклику java -cp . a- він повинен просто роздрукувати два рядки тексту, і він повинен працювати добре без помилок.

Потім видаліть файл "a $ b.class" (або заповніть його сміттям, або скопіюйте над ним a.class), щоб імітувати відсутній або пошкоджений клас. Ось що відбувається:

Перша спроба нового b ():
java.lang.NoClassDefFoundError: a $ b
    в a.main (a.javajanju)
Викликано: 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)
    at java.lang.ClassLoader.loadClass (ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
    ... ще 1

Друга спроба нового b ():
java.lang.NoClassDefFoundError: a $ b
    в a.main (a.java:7)

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

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

Тож якщо ви коли-небудь бачите NCDFE без кореневої причини, вам потрібно перевірити, чи зможете ви відслідковувати до першого завантаження класу, щоб знайти причину помилки.


Що щодо запуску 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 без кореневої причини, вам потрібно перевірити, чи зможете ви відслідковуватись до першого завантаження класу, щоб знайти причину помилки.
batwad

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 і запустіть тестовий клас, він кинеться

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 намагається завантажити у визначенні класу, і визначення класу не вдалося знайти.


Що щодо запуску JVM -verboseабо якогось подібного варіанту залежно від конкретного JVM? Можливо -verbose:class, можливо, -verbose:class:jniякщо використовувати JNI, але я не впевнений у синтаксисі.
PJTraill

-verbose:class:jniце неправильно, але ви можете передати два окремих варіанти: -verbose:class -verbose:jni.
PJTraill

15

У чому причина отримання кожного з них та будь-якого продуманого процесу щодо того, як боротися з такими помилками?

Вони тісно пов'язані. A ClassNotFoundExceptionкидається, коли Java пішла шукати певний клас по імені і не змогла його успішно завантажити. АNoClassDefFoundError кидається, коли Java пішла шукати клас, який був пов'язаний з деяким існуючим кодом, але не міг знайти його з тієї чи іншої причини (наприклад, неправильний класний шлях, неправильна версія Java, неправильна версія бібліотеки) і є досконалим фатальним оскільки це вказує на те, що щось пішло погано неправильно.

Якщо у вас є C-досвід, CNFE - це як невдача dlopen()/, dlsym()а NCDFE - проблема з лінкером; у другому випадку відповідні файли класу ніколи не повинні бути фактично складені в конфігурації, яку ви намагаєтеся ними використовувати.


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 викидається при спробі завантаження класу шляхом посилання на нього через String. Наприклад, параметр у Class.forName () - це String, і це підвищує потенціал передачі недійсних бінарних імен до завантажувача класів.

ClassNotFoundException викидається, коли зустрічається потенційно недійсне бінарне ім'я; наприклад, якщо ім'я класу має символ '/', ви зобов'язані отримати ClassNotFoundException. Він також кидається, коли безпосередньо посилається клас недоступний на шляху класу.

З іншого боку, NoClassDefFoundError кинуто

  • коли фактичне фізичне представлення класу - .class файл недоступний,
  • або клас завантажений вже в іншому завантажувачі класів (зазвичай батьківський завантажувач класів завантажив би клас, а значить, клас не можна завантажити знову),
  • або якщо було знайдено несумісне визначення класу - ім'я у файлі класу не відповідає запитуваному імені,
  • або (що найважливіше), якщо залежний клас неможливо знайти та завантажити. У цьому випадку безпосередньо посилається клас може бути розташований і завантажений, але залежний клас недоступний або не може бути завантажений. Це сценарій, коли безпосередньо посилається клас може бути завантажений через Class.forName або еквівалентні методи. Це вказує на збій у зв’язку.

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

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


Резюме для згадування "ім'я у файлі класу не відповідає запитуваному імені". Це досить поширена причина.
Маркіз Лорн

8

Різниця між ClassNotFoundException Vs NoClassDefFoundError

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


Не кристально чистий. "Не оновлюється в класі" є розпливчастим / неточним. Йдеться про те, що або JAR не присутній на класі, або неправильна версія JAR знаходиться на класі. І орфографічні помилки. І (зітхаючи), оскільки ви розмістили свою інформацію як прикольну графіку, ми не можемо це виправити.
Стівен C

8

З самими іменами ми можемо легко визначити одного, Exceptionа іншого - з якого Error.

Виняток: винятки трапляються під час виконання програми. Програміст може впоратися з цим винятком, спробувавши блок catch. У нас є два типи винятків. Перевірено виняток, який підкидає під час компіляції. Винятки під час виконання, які викидаються під час виконання, ці винятки зазвичай трапляються із-за поганого програмування.

Помилка: це зовсім не винятки, це виходить за рамки програміста. Ці помилки зазвичай кидаються JVM.


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

Різниця:

ClassNotFoundException:

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

NoClassDefFoundError:

  • Навантажувач класу не в змозі вирішити посилання класу у фазі зв’язку підсистеми завантаження класу, яку ми отримуємо NoClassDefFoundError.
  • NoClassDefFoundError- помилка, похідна від LinkageErrorкласу, яка використовується для вказівки випадків помилок, коли клас має залежність від якогось іншого класу і цей клас несумісно змінився після компіляції.
  • NoClassDefFoundErrorє результатом неявного завантаження класу через виклик методу з цього класу або будь-якого змінного доступу.

Схожість:

  • І те, NoClassDefFoundErrorі ClassNotFoundExceptionінше пов'язане з недоступністю класу під час виконання.
  • Обидва ClassNotFoundExceptionі NoClassDefFoundErrorпов'язані з Java classpath.

3

З огляду на дії підсистеми завантажувача класу:

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 , коли ваш статичний ініціалізатор або ініціалізатор для статичної змінної видає виняток.


1

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

Здебільшого цей виняток виникає при спробі запуску програми без оновлення classpath необхідними файлами JAR. Наприклад, ви, можливо, бачили цей виняток під час підключення коду JDBC до підключення до бази даних ieMySQL, але ваш класний шлях для нього не має JAR.

Помилка NoClassDefFoundError виникає, коли JVM намагається завантажити певний клас, який є частиною виконання вашого коду (як частина звичайного виклику методу або як частина створення екземпляра за допомогою нового ключового слова), і цей клас не присутній у вашому classpath, але був присутній під час компіляції, тому що для виконання вашої програми вам потрібно скомпілювати її, і якщо ви намагаєтеся використовувати клас, якого немає, компілятор викличе помилку компіляції.

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

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

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


0

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

ClassNotFoundException

Ієрархія класів

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Під час налагодження

  1. Потрібна баночка, клас відсутній у класі.
  2. Перевірте, чи всі необхідні банки перебувають у класі jvm.

NoClassDefFoundError

Ієрархія класів

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Під час налагодження

  1. Проблема з динамічним завантаженням класу, який був складений належним чином
  2. Проблема зі статичними блоками, конструкторами, методами init () залежного класу та фактична помилка загортається декількома шарами [особливо, коли ви використовуєте весну, сплячку, фактичний виняток загортається, і ви отримаєте 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 викине 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.