Chyba NoClassDefFoundError

NoClassDefFoundError je nejčastější chybou při vývoji v Javě. V každém případě se podívejme na to, proč k tomu dochází a co dělat, abychom to vyřešili

Chyba NoClassDefFoundError v jazyce Java nastává tehdy, když virtuální stroj Java nemůže během běhu najít konkrétní třídu, která byla k dispozici v době kompilace. Například, pokud máme volání metody ze třídy nebo přístup k některému statickému členovi třídy a tato třída není během běhu k dispozici, JVM vygeneruje chybu NoClassDefFoundError.

Rozdíl mezi java.lang.NoClassDefFoundError a ClassNotFoundException v jazyce Java

Výjimka ClassNotFoundException vzniká, když se JVM pokouší načíst třídu během běhu, tzn. j. během běhu zadáte název třídy a poté se ji JVM pokusí načíst a pokud se třída nenajde, vygeneruje výjimku java.lang.ClassNotFoundException.

Zatímco v případě NoClassDefFoundError byla problémová třída přítomna v době kompilace, a proto se program úspěšně zkompiloval, ale z nějakého důvodu není dostupný v době běhu.

Pokračujme v řešení chyby java.lang.NoClassDefFoundError

Musíme přidat NoClassDefFoundError do Classpath nebo zkontrolovat, proč není k dispozici v Classpath. Důvodů může být několik, například:

  • Třída není dostupná v Java Classpath.
  • Je možné, že spouštíte program s jar a třída není definována v atributu ClassPath.
  • Každý spouštěcí skript přepíše proměnnou prostředí Classpath. Jelikož NoClassDefFoundError je podtřídou java.lang.LinkageError, může se objevit i tehdy, pokud knihovna nemusí být k dispozici.
  • Zkontrolujte, zda se v souboru protokolu nenachází chyba java.lang.ExceptionInInitializerError. NoClassDefFoundError z důvodu selhání inicializace je poměrně častá.
  • Pokud pracujete v prostředí J2EE, zobrazení třídy mezi více Classloadery může také způsobit chybu java.lang.NoClassDefFoundError.

Nahrávač tříd v jazyce Java

Zopakujme si, že nahrávač tříd používá při své činnosti tři základní principy: delegování, viditelnost a jedinečnost.

  • Delegování znamená, že každý požadavek na načtení třídy je delegován na nadřazený zavaděč tříd.
  • Viditelnost znamená schopnost najít třídy načtené zavaděčem tříd: všechny podřazené zavaděče tříd mohou vidět třídy načtené rodičovským zavaděčem tříd, ale rodičovský zavaděč tříd nemůže vidět třídu načtenou podřazeným zavaděčem tříd.
  • Jedinečnost zajišťuje, že třída načtená nadřazeným zavaděčem tříd nebude znovu načtena podřazeným zavaděčem tříd.

Každá instance zavaděče tříd má přiřazený nadřazený zavaděč tříd. Předpokládejme, že zavaděč tříd vaší aplikace potřebuje zavést třídu A. Zavaděč tříd vaší aplikace se nejprve pokusí delegovat hledání třídy A na svůj nadřazený zavaděč tříd a teprve poté se ji pokusí zavést sám. Můžete projít dlouhým řetězcem nadřazených zavaděčů, dokud se nedostanete k úvodnímu zavaděči virtuálního stroje Java.

V čem je tedy problém? Pokud je třída A nalezena a načtena některým nadřazeným zavaděčem, znamená to, že podřazený zavaděč ji již nenačte, což je pravděpodobně to, na co čekáte, což vede k chybě NoClassDefFoundError.

Jak začít programovat?

Úvod do programování pro každého bez předchozích znalostí.

Stáhněte si náš ebook teď výjimečně zdarma!!!

Cicso Lab v Bratislave

Mohlo by vás zaujímať:

Java TeamLeader Připraven pomoci.

Java TeamLeader

Online kurz programování v Javě

Školenie-java-pre-začíatočnikov

Programování není obtížné! Kódování vlastních appek v nástroji Java je veliká zábava. Do konce léta programujete vy sami nebo vaše bystré děti své první appky

Jak začít programovat?

Ako začať programovať?

Úvod do programování pro každého bez předchozích znalostí. SStáhněte si náš ebook teď výjimečně zdarma!!!

Ovládněte GIT a GitHub z příkazové řádky jako hacker

Školení-java-pro-začátečníky

Vyhraďte si den-dva a naučte se pracovat s GITem tak, že vám vaši kolegové budou dívat přes rameno, jak to do pekla děláte... od úplných základů přes praktické příklady.

7denní výzva programování Webu

7dňová výzva programovania Webu

Budete umět vytvářet pěkné weby koncem příštího týdne? Ano, dá se to! Rádi vám s tím pomůžeme. Stačí přijmout Sedmidenní výzvu a rezervovat si tento kurz