NoSuchFieldError i Java

1. Oversigt

I denne artikel vil vi demonstrere årsagen bag NoSuchFieldError og find ud af, hvordan du løser det.

2. NoSuchFieldError

Som navnet antyder, NoSuchFieldError opstår, når et bestemt felt ikke findes. NoSuchFieldError udvider IncompatibleClassChangeError klasse og kastes når applikationen forsøger at få adgang til eller ændre et felt i et objekt eller et statisk felt i en klasse, men objektet eller klassen ikke længere har dette felt.

IncompatibleClassChangeError klasse udvider LinkageError klasse og opstår, når vi udfører uforenelige ændringer af klassedefinitioner. Langt om længe, LinkageError strækker sig Fejl og viser, at en klasse har en vis afhængighed af en anden uforeneligt ændret klasse.

Lad os se denne fejl i aktion ved hjælp af et eksempel. Lad os som et første trin oprette en Afhængighed klasse:

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

Så opretter vi en FieldErrorExample klasse, der refererer til et felt i vores Afhængighed klasse:

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

Lad os også tilføje kode for at kontrollere, om vi får en besked fra Afhængighed klasse:

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

Nu kan vi kompilere disse filer ved hjælp af javac kommando og efter udførelse af FieldErrorExample klasse ved hjælp af java kommando udskriver den specificerede besked.

Imidlertid, hvis vi kommenterer, fjerner eller ændrer attributnavnet i Afhængighed klasse og kompilere det igen, så løber vi ind i vores fejl.

Lad os for eksempel ændre attributnavnet i vores Afhængighed klasse:

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

Hvis vi kun kompilerer vores igen Afhængighed klasse, og derefter udføre FieldErrorExample igen, vil vi støde på NoSuchFieldError:

Undtagelse i tråden "main" java.lang.NoSuchFieldError: meddelelse

Ovenstående fejl opstod, fordi FieldErrorExample klasse henviser stadig til det statiske felt besked af Afhængighed klasse, men den eksisterer ikke længere - vi har foretaget en uforenelig ændring af Afhængighed klasse.

3. Løsning af fejlen

For at undgå denne fejl skal vi rens og kompiler de eksisterende filer. Vi kan gøre det bruger javac kommando eller med Maven ved at køre mvn ren installation. Ved at udføre dette trin har vi alle de seneste kompilerede filer, og vi undgår at løbe ind i fejlen.

Hvis fejlen fortsætter, kan problemet være flere JAR-filer: en under kompilering og en anden, mens den kører. Dette sker ofte, når applikationen afhænger af eksterne JAR'er. Her skal vi valider rækkefølgen af ​​JAR'erne i build-stien for at identificere den inkonsekvente JAR.

Hvis vi skal undersøge nærmere, er det nyttigt at køre applikationen med -verbose: klassemulighedfor at kontrollere de indlæste klasser. Dette kan hjælpe os med at identificere den forældede klasse.

Nogle gange henviser en JAR fra tredjepart internt til en anden version, hvilket resulterer i NoSuchFieldError. Hvis dette sker, kan vi bruge mvn afhængighed: træ -Dverbose. Dette genererer maven afhængighedstræ og hjælper os med at identificere den inkonsekvente JAR.

4. Konklusion

I denne korte vejledning har vi vist hvorfor NoSuchFieldError opstår og så på, hvordan vi kan løse det.

Som altid er koden tilgængelig på GitHub.


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