NoSuchMethodError v Jave

1. Prehľad

V tomto výučbe sa pozrieme na java.lang.NoSuchMethodError a niektoré spôsoby, ako to zvládnuť.

2. NoSuchMethodError

Ako už názov napovedá, the NoSuchMethodError nastane, keď sa konkrétna metóda nenájde. Touto metódou môže byť buď inštančná metóda, alebo statická metóda.

Väčšinou,túto chybu sme schopní zachytiť v čase kompilácie. Preto, nie je to veľký problém. Avšak niekedy to mohlo byť vyhodené za behu, potom je zistenie, že je to trochu ťažké. Podľa dokumentácie Oracle sa táto chyba môže vyskytnúť za behu programu, ak bola trieda nekompatibilne zmenená.

Preto sa s touto chybou môžeme stretnúť v nasledujúcich prípadoch. Po prvé, ak urobíme iba čiastočnú rekompiláciu nášho kódu. Po druhé, ak existuje nekompatibilita verzie so závislosťami v našej aplikácii, napríklad v externých nádobách.

Všimnite si, že NoSuchMethodError dedičský strom obsahuje IncompatibleClassChangeError a LinkageError. Tieto chyby sú spojené s nekompatibilnou zmenou triedy po kompilácii.

3. Príklad NoSuchMethodError

Pozrime sa na túto chybu v akcii s príkladom. Za týmto účelom vytvoríme dve triedy. Prvý je SpecialToday ktorý bude obsahovať zoznam špecialít pre daný deň v reštaurácii:

verejná trieda SpecialToday {private static String desert = "Chocolate Cake"; public static String getDesert () {návrat púšť; }}

Druhá trieda Hlavné menu volá metódy z Špeciálne ponuky dnes:

public class MainMenu {public static void main (String [] args) {System.out.println ("Today's Specials:" + getSpecials ()); } public static String getSpecials () {return SpecialToday.getDesert (); }}

Tu bude výstup:

Dnešné špeciály: Čokoládový koláč

Ďalej odstránime metódu getDesert () SpecialToday a prekompilovať iba túto aktualizovanú triedu. Tentokrát, keď bežíme naše Hlavné menu, všimli sme si nasledujúcu runtime chybu:

Výnimka vo vlákne „main“ java.lang.NoSuchMethodError: SpecialToday.getDesert () Ljava / lang / String;

4. Ako zaobchádzať NoSuchMethodError

Teraz sa pozrime, ako to môžeme vyriešiť. U vyššie uvedeného kódu poďme urobiť úplnú čistú kompiláciu, vrátane oboch tried. Počas kompilácie si všimneme, že chyba bude zachytená. Ak použijeme IDE ako Eclipse, zistí sa to ešte skôr, akonáhle aktualizujeme Špeciálne dnes.

Ak teda narazíme na túto chybu v našich aplikáciách, v prvom kroku urobíme úplnú čistú kompiláciu. S mavenom spustíme mvn čistá inštalácia príkaz.

Niekedy je problém s externými závislosťami našej aplikácie. V tomto prípade budeme najskôr skontrolujte poradie pohárov v ceste zostavenia vytiahnutej zavádzačom triedy. A budeme sledovať a aktualizovať nekonzistentnú nádobu.

Ak sa však s touto chybou stretneme aj za behu, budeme musieť siahnuť hlbšie. Budeme musieť zabezpečiť, aby triedy a poháre kompilácie a runtime mali rovnaké verzie. Za toto môžeme spustite aplikáciu s voľbou -verbose: class skontrolovať načítané triedy. Príkaz môžeme spustiť nasledovne:

$ java -verbose: trieda com.baeldung.exceptions.nosuchmethoderror.MainMenu [0,014 s] [informácie] [trieda, načítanie] otvorené: / usr / lib / jvm / java-11-openjdk-amd64 / lib / moduly [0,015 s ] [info] [trieda, načítanie] otvorené: /usr/share/java/java-atk-wrapper.jar [0,028 s] [info] [trieda, načítanie] java.lang.Object zdroj: súbor zdieľaných objektov [0,028s ] [informácie] [trieda, načítanie] java.io.Serializovateľný zdroj: súbor zdieľaných objektov

Pomocou týchto informácií o všetkých triedach načítaných do jednotlivých pohárov môžeme za behu modulu vypátrať nekompatibilnú závislosť.

Mali by sme tiež uistite sa, že neexistujú duplicitné triedy v dvoch alebo viacerých pohároch. Vo väčšine prípadov pomôže maven kontrolovať konfliktné závislosti priamo. Ďalej môžeme prevádzkovať závislosť mvn: strom príkazom získate strom závislostí nášho projektu nasledovne:

Závislosť $ mvn: strom [INFO] Vyhľadáva sa projekty ... [INFO] [INFO] --------------------------- [INFO] Budovanie nosuchmethoderror 0.0.1-SNAPSHOT [INFO] -------------------------------- [jar] ----- ---------------------------- [INFO] [INFO] --- plugin pre závislosť maven: 2.8: strom (predvolené-cli ) @ nosuchmethoderror --- [INFO] com.baeldung.exceptions: nosuchmethoderror: jar: 0.0.1-SNAPSHOT [INFO] \ - org.junit: junit-bom: pom: 5.7.0-M1: kompilácia

Môžeme skontrolovať knižnice a ich verzie v zozname vygenerovanom týmto príkazom. Okrem toho môžeme tiež spravovať závislosti pomocou značiek maven. Pomocou značku, môžeme vylúčiť problematickú závislosť. Pomocou tagu, môžeme zabrániť tomu, aby sa nežiaduce závislosti zoskupili do jar alebo vojny.

5. Záver

V tomto článku sme sa venovali NoSuchMethodError. Diskutovali sme o príčine tejto chyby a tiež o spôsoboch jej riešenia. Viac podrobností o správnom zaobchádzaní s chybami nájdete v našom článku o zachytávaní chýb Java.

Ako vždy, kód uvedený v tomto článku je k dispozícii na GitHub.


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