NoSuchFieldError u Javi

1. Pregled

U ovom ćemo članku pokazati razlog tome NoSuchFieldError i otkriti kako to riješiti.

2. NoSuchFieldError

Kao što i samo ime govori, NoSuchFieldError događa se kada određeno polje ne postoji. NoSuchFieldError proširuje IncompatibleClassChangeError razreda i baca se kada aplikacija pokušava pristupiti ili izmijeniti polje objekta ili statično polje klase, ali objekt ili klasa više nema to polje.

IncompatibleClassChangeError razred proširuje Pogreška veze klase i javlja se kada vršimo nespojive promjene definicije klase. Konačno, Pogreška veze proteže se Pogreška i pokazuje da klasa ima određenu ovisnost o drugoj nespojivo promijenjenoj klasi.

Pogledajmo ovu pogrešku na djelu uz pomoć primjera. Kao prvi korak, napravimo Ovisnost razred:

javna klasa Ovisnost {public static String message = "Hello Baeldung !!"; }

Tada ćemo stvoriti FieldErrorExample razred koji se odnosi na polje našeg Ovisnost razred:

javna klasa FieldErrorExample {javni statički niz getDependentMessage () {return Dependency.message; }}

Dodamo i kod da provjerimo dobivamo li poruka od Ovisnost razred:

javna statička void fetchAndPrint () {System.out.println (getDependentMessage ()); } 

Sada te datoteke možemo kompajlirati pomoću javac naredbe i po izvršenju FieldErrorExample razred koristeći Java naredba, ispisat će navedenu poruka.

Međutim, ako komentiramo, uklonimo ili promijenimo naziv atributa u Ovisnost klase i prekompajlirajte je, tada ćemo naletjeti na našu pogrešku.

Na primjer, promijenimo naziv atributa u našem Ovisnost razred:

javna klasa Ovisnost {public static String msg = "Pozdrav Baeldung !!"; }

Sad, ako prekompajliramo samo naše Ovisnost razred, a zatim izvršiti FieldErrorExample opet ćemo naići na NoSuchFieldError:

Iznimka u niti "main" java.lang.NoSuchFieldError: poruka

Gornja se pogreška dogodila jer Primjer poljaError klasa se i dalje odnosi na statičko polje poruka od Ovisnost klase, ali više ne postoji - unijeli smo nespojivu promjenu u Ovisnost razred.

3. Rješavanje pogreške

Da bismo izbjegli ovu pogrešku, moramo očistite i prevedite postojeće datoteke. Mi to možemo koristiti javac naredbu ili s Mavenom trčanjem mvn čista instalacija. Izvođenjem ovog koraka imat ćemo sve najnovije kompajlirane datoteke i izbjeći ćemo naletjeti na pogrešku.

Ako se pogreška i dalje javlja, problem bi mogao biti više JAR datoteka: jedna tijekom prevođenja, a druga tijekom izvođenja. To se često događa kada aplikacija ovisi o vanjskim JAR-ovima. Evo, trebali bismo potvrdite redoslijed JAR-ova u stazi izrade prepoznati nedosljedni JAR.

Ako moramo istražiti dalje, korisno je pokrenite aplikaciju sa -verbose: opcija klaseza provjeru učitanih klasa. To nam može pomoći identificirati zastarjeli razred.

Ponekad se JAR treće strane možda interno odnosi na drugu verziju, što rezultira NoSuchFieldError. Ako se to dogodi, možemo koristiti mvn ovisnost: stablo -Dverbose. Ovo generira stablo ovisnosti maven i pomaže nam u prepoznavanju nedosljednog JAR-a.

4. Zaključak

U ovom kratkom vodiču pokazali smo zašto NoSuchFieldError događa i pogledao kako to možemo riješiti.

Kao i uvijek, kôd je dostupan na GitHub-u.


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