NoSuchMethodError di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat java.lang.NoSuchMethodError dan beberapa cara untuk mengatasinya.

2. NoSuchMethodError

Seperti namanya, yang NoSuchMethodError berlaku apabila kaedah tertentu tidak ditemui . Kaedah ini boleh menjadi kaedah contoh atau kaedah statik.

Dalam kebanyakan kes, kami dapat mengatasi ralat ini pada waktu kompilasi. Oleh itu , ia bukan masalah besar. Walau bagaimanapun, kadang-kadang ia dilemparkan pada waktu runtime , kemudian merasa menjadi agak sukar. Menurut dokumentasi Oracle, ralat ini mungkin berlaku pada waktu berjalan sekiranya kelas telah diubah secara tidak serasi.

Oleh itu, kami mungkin menghadapi kesilapan ini dalam kes berikut. Pertama, sekiranya kita melakukan penyusunan semula sebahagian kod kita. Kedua, jika terdapat versi yang tidak sesuai dengan ketergantungan dalam aplikasi kami, seperti tempayan luaran.

Perhatikan bahawa pokok warisan NoSuchMethodError merangkumi IncompatibleClassChangeError dan LinkageError. Kesalahan ini dikaitkan dengan perubahan kelas yang tidak serasi setelah penyusunan.

3. Contoh NoSuchMethodError

Mari lihat ralat ini dalam tindakan dengan contoh. Untuk ini, kami akan membuat dua kelas. Pertama adalah SpecialToday yang akan menyenaraikan spesial untuk hari ini di restoran:

public class SpecialToday { private static String desert = "Chocolate Cake"; public static String getDesert() { return desert; } }

Kaedah panggilan MainMenu kelas kedua dari SpecialsToday:

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

Di sini outputnya adalah:

Today's Specials: Chocolate Cake

Seterusnya, kami akan memadamkan kaedah getDesert () di SpecialToday dan hanya mengumpul semula kelas yang dikemas kini ini. Kali ini semasa kami menjalankan MainMenu, kami melihat ralat runtime berikut:

Exception in thread "main" java.lang.NoSuchMethodError: SpecialToday.getDesert()Ljava/lang/String;

4. Cara Mengendalikan Kesalahan NoSuchMethodError

Sekarang mari kita lihat bagaimana kita dapat mengatasi ini. Untuk kod di atas, mari lakukan kompilasi bersih sepenuhnya, termasuk kedua-dua kelas. Kami akan menyedari bahawa ralat akan ditangkap semasa kami menyusun. Sekiranya kita menggunakan IDE seperti Eclipse , ia akan dikesan lebih awal lagi, sebaik sahaja kita mengemas kini SpecialsToday .

Oleh itu, jika kita menghadapi ralat ini dengan aplikasi kita, sebagai langkah pertama, kita akan melakukan kompilasi bersih sepenuhnya. Dengan maven, kami akan menjalankan perintah mvn clean install .

Kadang kala masalahnya adalah dengan kebergantungan luaran aplikasi kita. Dalam kes ini, pertama-tama kita akan memeriksa susunan balang di lorong binaan yang ditarik oleh pemuat classpath. Dan kami akan mengesan dan mengemas kini balang yang tidak konsisten.

Walau bagaimanapun, jika kita masih menghadapi kesalahan ini semasa menjalankan, kita harus menggali lebih dalam. Kita mesti memastikan bahawa kelas Kompilasi dan Masa Jalan dan tempayan mempunyai versi yang sama . Untuk ini, kita boleh menjalankan aplikasi dengan pilihan -verbose: class untuk memeriksa kelas yang dimuat. Kita boleh menjalankan perintah seperti berikut:

$ java -verbose:class com.baeldung.exceptions.nosuchmethoderror.MainMenu [0.014s][info][class,load] opened: /usr/lib/jvm/java-11-openjdk-amd64/lib/modules [0.015s][info][class,load] opened: /usr/share/java/java-atk-wrapper.jar [0.028s][info][class,load] java.lang.Object source: shared objects file [0.028s][info][class,load] java.io.Serializable source: shared objects file

Dengan menggunakan maklumat ini mengenai semua kelas yang dimuatkan di dalam balang individu, semasa menjalankan, kita dapat mengesan ketergantungan yang tidak sesuai.

Kita juga harus memastikan bahawa tidak ada kelas pendua dalam dua atau lebih balang. Dalam kebanyakan kes, maven akan membantu mengawal pergantungan yang bertentangan secara langsung. Selanjutnya, kita dapat menjalankan perintah dependensi mvn: tree untuk mendapatkan pokok kebergantungan projek kita seperti berikut:

$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] --------------------------- [INFO] Building nosuchmethoderror 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ nosuchmethoderror --- [INFO] com.baeldung.exceptions:nosuchmethoderror:jar:0.0.1-SNAPSHOT [INFO] \- org.junit:junit-bom:pom:5.7.0-M1:compile

Kita dapat memeriksa perpustakaan dan versi mereka dalam senarai yang dihasilkan oleh perintah ini. Selain itu, kami juga dapat menguruskan kebergantungan menggunakan tag maven. Menggunakantag, kita boleh mengecualikan pergantungan yang bermasalah. Menggunakan tag, kita dapat mengelakkan kebergantungan yang tidak diingini dimasukkan dalam tempayan atau perang.

5. Kesimpulan

Dalam artikel ini, kami membahas NoSuchMethodError . Kami membincangkan punca ralat ini dan juga cara untuk mengatasinya. Untuk keterangan lebih lanjut mengenai cara menangani kesalahan dengan betul, lihat artikel kami tentang menangkap kesalahan Java.

Seperti biasa, kod yang disajikan dalam artikel ini terdapat di GitHub.