NoSuchFieldError i Java

1. Oversikt

I denne artikkelen vil vi demonstrere årsaken bak NoSuchFieldError og oppdag hvordan du kan løse det.

2. NoSuchFieldError

Som navnet antyder, NoSuchFieldError oppstår når et spesifisert felt ikke eksisterer. NoSuchFieldError utvider InkompatibelClassChangeError klasse og blir kastet når applikasjonen prøver å få tilgang til eller endre et felt av et objekt eller et statisk felt av en klasse, men objektet eller klassen ikke lenger har det feltet.

InkompatibelClassChangeError klasse utvider LinkageError klasse og oppstår når vi utfører inkompatible endringer av klassedefinisjon. Endelig, LinkageError strekker Feil og viser at en klasse har en viss avhengighet av en annen uforenlig klasse.

La oss se denne feilen i aksjon ved hjelp av et eksempel. Som et første trinn, la oss lage en Avhengighet klasse:

offentlig klasse Avhengighet {offentlig statisk strengmelding = "Hei Baeldung !!"; }

Så lager vi en FieldErrorExample klasse som refererer til et felt av vårt Avhengighet klasse:

public class FieldErrorExample {public static String getDependentMessage () {return Dependency.message; }}

La oss også legge til kode for å sjekke om vi får en beskjed fra Avhengighet klasse:

offentlig statisk tomrom fetchAndPrint () {System.out.println (getDependentMessage ()); } 

Nå kan vi kompilere disse filene ved hjelp av javac kommando, og ved utførelse av FieldErrorExample klasse ved hjelp av java kommandoen, vil den skrive ut den spesifiserte beskjed.

Derimot, hvis vi kommenterer, fjerner eller endrer attributtnavnet i Avhengighet klasse og kompilere den på nytt, så får vi feilen vår.

La oss for eksempel endre attributtnavnet i vårt Avhengighet klasse:

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

Nå, hvis vi bare kompilerer vårt Avhengighet klasse, og deretter utføre FieldErrorExample igjen, vil vi møte NoSuchFieldError:

Unntak i tråden "hoved" java.lang.NoSuchFieldError: melding

Ovennevnte feil oppstod fordi FieldErrorExample klasse refererer fortsatt til det statiske feltet beskjed av Avhengighet klasse, men den eksisterer ikke lenger - vi har gjort en inkompatibel endring av Avhengighet klasse.

3. Løse feilen

For å unngå denne feilen, må vi rengjør og kompiler eksisterende filer. Vi kan gjøre dette bruker javac kommando eller med Maven ved å løpe mvn ren installasjon. Ved å utføre dette trinnet har vi alle de siste kompilerte filene, og vi unngår å løpe inn i feilen.

Hvis feilen vedvarer, kan problemet være flere JAR-filer: en mens du kompilerer, og en annen mens den kjører. Dette skjer ofte når applikasjonen er avhengig av eksterne JAR. Her burde vi validere rekkefølgen på JAR-ene i byggestien for å identifisere den inkonsekvente JAR.

Hvis vi må undersøke nærmere, er det nyttig å kjør applikasjonen med -verbose: klassealternativfor å sjekke de lastede klassene. Dette kan hjelpe oss med å identifisere den utdaterte klassen.

Noen ganger kan en tredjeparts JAR internt henvise til en annen versjon, noe som resulterer i NoSuchFieldError. Hvis dette skjer, kan vi bruke mvn avhengighet: tre -Dverbose. Dette genererer maven avhengighet treet og hjelper oss med å identifisere den inkonsekvente JAR.

4. Konklusjon

I denne korte opplæringen har vi vist hvorfor NoSuchFieldError oppstår og så på hvordan vi kan løse det.

Som alltid er koden tilgjengelig på GitHub.


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