NoSuchMethodError u Javi

1. Pregled

U ovom uputstvu pogledat ćemo java.lang.NoSuchMethodError i neki načini kako to riješiti.

2. NoSuchMethodError

Kao što i samo ime govori, the NoSuchMethodError nastaje kada određena metoda nije pronađena. Ova metoda može biti metoda instance ili statička metoda.

U većini slučajeva,ovu pogrešku možemo uhvatiti u vrijeme prevođenja. Stoga, nije veliki problem. Međutim, ponekad bi se mogao baciti za vrijeme izvođenja, tada je pomalo teško pronaći. Prema Oracleovoj dokumentaciji, ova se pogreška može pojaviti tijekom izvođenja ako je klasa nekompatibilno promijenjena.

Stoga se s ovom pogreškom možemo susresti u sljedećim slučajevima. Prvo, ako napravimo samo djelomičnu rekompilaciju našeg koda. Drugo, ako postoji nekompatibilnost verzije sa ovisnostima u našoj aplikaciji, poput vanjskih staklenki.

Imajte na umu da NoSuchMethodError nasljedno stablo uključuje IncompatibleClassChangeError i LinkageError. Te su pogreške povezane s nekompatibilnom promjenom klase nakon kompilacije.

3. Primjer NoSuchMethodError

Pogledajmo ovu pogrešku na djelu na primjeru. Za to ćemo stvoriti dvije klase. Prvo je SpecialToday koji će navesti posebne ponude za taj dan u restoranu:

javna klasa SpecialToday {private static String desert = "Čokoladna torta"; javni statički niz getDesert () {return desert; }}

Druga klasa Glavni izbornik poziva metode iz Danas:

javna klasa MainMenu {public static void main (String [] args) {System.out.println ("Današnje akcije:" + getSpecials ()); } javni statički niz getSpecials () {return SpecialToday.getDesert (); }}

Ovdje će izlaz biti:

Današnje akcije: Čokoladna torta

Zatim ćemo izbrisati metodu getDesert () u SpecialToday i rekompajlirati samo ovu ažuriranu klasu. Ovaj put kad pokrenemo svoj Glavni izbornik, primjećujemo sljedeću pogrešku u izvođenju:

Iznimka u niti "main" java.lang.NoSuchMethodError: SpecialToday.getDesert () Ljava / lang / String;

4. Kako postupati NoSuchMethodError

Sada da vidimo kako to možemo riješiti. Za gornji kod, krenimo napraviti potpuno čisto kompajliranje, uključujući oba razreda. Primijetit ćemo da će se pogreška uhvatiti dok kompajliramo. Ako koristimo IDE poput Eclipsea, to će biti otkriveno još ranije, čim ažuriramo Danas.

Stoga, ako naletimo na ovu pogrešku s našim aplikacijama, kao prvi korak napravit ćemo potpuno čisto prevođenje. S Mavenom ćemo pokrenuti mvn čista instalacija naredba.

Ponekad je problem u vanjskim ovisnostima naše aplikacije. U ovom ćemo slučaju prvo provjerite redoslijed staklenki u stazi izrade koju je povukao loader učitelja puta. I tražit ćemo i ažurirati nedosljednu jar.

Međutim, ako se i dalje susrećemo s ovom pogreškom tijekom izvođenja, morat ćemo dublje kopati. Morat ćemo osigurajte da klase i staklenke vremena kompajliranja i izvođenja imaju iste verzije. Za ovo možemo pokrenite aplikaciju s opcijom -verbose: class za provjeru učitanih klasa. Naredbu možemo pokrenuti na sljedeći način:

$ java -verbose: class com.baeldung.exceptions.nosuchmethoderror.MainMenu [0,014s] [info] [class, load] otvoren: / usr / lib / jvm / java-11-openjdk-amd64 / lib / modules [0.015s ] [info] [klasa, učitavanje] otvoreno: /usr/share/java/java-atk-wrapper.jar [0,028s] [info] [class, load] java.lang.Object izvor: datoteka zajedničkih objekata [0,028s ] [info] [class, load] java.io.Serializable source: datoteka zajedničkih objekata

Koristeći ove informacije o svim klasama koje se učitavaju u pojedinačne staklenke, tijekom izvođenja možemo pratiti nespojivu ovisnost.

Trebali bismo i mi pobrinite se da nema dupliciranih klasa u dvije ili više staklenki. U većini slučajeva, maven će pomoći u kontroli sukobljenih ovisnosti direktno. Nadalje, možemo pokrenuti mvn ovisnost: stablo naredba za dobivanje stabla ovisnosti našeg projekta kako slijedi:

Ovisnost $ mvn: stablo [INFO] Skeniranje projekata ... [INFO] [INFO] --------------------------- [INFO] Izgradnja nosuchmethoderror 0.0.1-SNAPSHOT [INFO] -------------------------------- [jar] ----- ---------------------------- [INFO] [INFO] --- dodatak za ovisnost maven: 2.8: stablo (zadana-cli ) @ nosuchmethoderror --- [INFO] com.baeldung.exceptions: nosuchmethoderror: jar: 0.0.1-SNAPSHOT [INFO] \ - org.junit: junit-bom: pom: 5.7.0-M1: compile

Knjižnice i njihove verzije možemo provjeriti na popisu generiranom ovom naredbom. Štoviše, ovisnostima također možemo upravljati pomoću maven oznaka. Koristiti oznaku, možemo isključiti problematičnu ovisnost. Koristiti tag, možemo spriječiti da se neželjene ovisnosti grupiraju u jar ili rat.

5. Zaključak

U ovom smo se članku obratili NoSuchMethodError. Razgovarali smo o uzroku ove pogreške, kao i načinima kako je riješiti. Za više detalja o tome kako pravilno postupati s pogreškama, pogledajte naš članak o hvatanju Java pogrešaka.

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na GitHubu.