NoSuchFieldError v Jave

1. Prehľad

V tomto článku si ukážeme dôvody NoSuchFieldError a zistiť, ako to vyriešiť.

2. NoSuchFieldError

Ako už názov napovedá, NoSuchFieldError nastane, keď zadané pole neexistuje. NoSuchFieldError rozširuje IncompatibleClassChangeError triedy a je vyhodený keď sa aplikácia pokúsi získať prístup alebo upraviť pole objektu alebo statické pole triedy, ale objekt alebo trieda už toto pole nemá.

IncompatibleClassChangeError trieda rozširuje Chyba prepojenia triedy a nastane, keď vykonáme nekompatibilné zmeny definície triedy. Nakoniec Chyba prepojenia predlžuje Chyba a ukazuje, že trieda je závislá od inej nekompatibilne zmenenej triedy.

Pozrime sa na túto chybu v akcii pomocou príkladu. Ako prvý krok vytvorme a Závislosť trieda:

public class Dependency {public static String message = "Hello Baeldung !!"; }

Potom vytvoríme a FieldErrorExample triedy, ktorá odkazuje na pole našej Závislosť trieda:

verejná trieda FieldErrorExample {verejný statický reťazec getDependentMessage () {návrat Dependency.message; }}

Pridajme tiež kód na kontrolu, či dostaneme správa z Závislosť trieda:

public static void fetchAndPrint () {System.out.println (getDependentMessage ()); } 

Teraz môžeme tieto súbory zostaviť pomocou súboru javac velenia a po vykonaní FieldErrorExample triedy pomocou java príkaz vypíše zadaný správa.

Avšak ak komentujeme, odstraňujeme alebo meníme názov atribútu v Závislosť triedy a prekompilovať to, potom narazíme na našu chybu.

Zmeňme napríklad názov atribútu v našom Závislosť trieda:

public class Dependency {public static String msg = "Hello Baeldung !!"; }

Teraz, ak prekompilujeme iba našu Závislosť trieda, a potom vykonať FieldErrorExample opäť sa stretneme s NoSuchFieldError:

Výnimka vo vlákne „main“ java.lang.NoSuchFieldError: správa

Vyššie uvedená chyba sa vyskytla, pretože FieldErrorExample trieda stále odkazuje na statické pole správa z Závislosť triedy, ale už neexistuje - vykonali sme nekompatibilnú zmenu v triede Závislosť trieda.

3. Riešenie chyby

Aby sme sa vyhli tejto chybe, musíme vyčistiť a skompilovať existujúce súbory. Zvládneme to pomocou javac príkazom alebo s Mavenom spustením mvn čistá inštalácia. Vykonaním tohto kroku budeme mať všetky najnovšie skompilované súbory a vyhneme sa tomu, aby sa chyba nestala.

Ak chyba pretrváva, problémom môže byť viac súborov JAR: jeden pri kompilácii a druhý za behu. To sa často stáva, keď aplikácia závisí od externých súborov JAR. Tu by sme mali overte poradie súborov JAR v ceste zostavenia na identifikáciu nekonzistentného JAR.

Ak budeme musieť vyšetrovať ďalej, je užitočné spustiť aplikáciu s -verbose: možnosť triedyskontrolovať načítané triedy. To nám môže pomôcť identifikovať zastaranú triedu.

Niekedy môže JAR tretej strany interne odkazovať na inú verziu, ktorej výsledkom je NoSuchFieldError. Ak sa to stane, môžeme použiť závislosť mvn: strom -Dverbose. Toto vygeneruje strom závislostí maven a pomáha nám pri identifikácii nekonzistentného JAR.

4. Záver

V tomto krátkom tutoriáli sme si ukázali prečo NoSuchFieldError nastane a pozrel sa na to, ako to môžeme vyriešiť.

Ako vždy, kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found