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.
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.
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:
Zopakujme si, že nahrávač tříd používá při své činnosti tři základní principy: delegování, viditelnost a jedinečnost.
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.