NoSuchMethodError di Java

1. Ikhtisar

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

2. NoSuchMethodError

Seperti namanya, yang NoSuchMethodError terjadi ketika metode tertentu tidak ditemukan . Metode ini dapat berupa metode contoh atau metode statis.

Dalam kebanyakan kasus, kami dapat menemukan kesalahan ini pada waktu kompilasi. Makanya , ini bukan masalah besar. Namun, terkadang itu bisa dilempar saat runtime , kemudian menemukannya menjadi agak sulit. Menurut dokumentasi Oracle, kesalahan ini dapat terjadi saat runtime jika kelas telah diubah secara tidak kompatibel.

Karenanya, kami mungkin mengalami kesalahan ini dalam kasus berikut. Pertama, jika kita melakukan kompilasi ulang sebagian dari kode kita. Kedua, jika ada ketidakcocokan versi dengan dependensi di aplikasi kita, seperti stoples eksternal.

Perhatikan bahwa pohon warisan NoSuchMethodError menyertakan IncompatibleClassChangeError dan LinkageError. Kesalahan ini terkait dengan perubahan kelas yang tidak kompatibel setelah kompilasi.

3. Contoh NoSuchMethodError

Mari kita lihat kesalahan ini beraksi dengan sebuah contoh. Untuk ini, kami akan membuat dua kelas. Pertama adalah SpecialToday yang akan mencantumkan spesial untuk hari itu di restoran:

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

MainMenu kelas kedua memanggil metode 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(); } }

Berikut outputnya adalah:

Today's Specials: Chocolate Cake

Selanjutnya, kami akan menghapus metode getDesert () di SpecialToday dan mengkompilasi ulang hanya kelas yang diperbarui ini. Kali ini ketika kami menjalankan MainMenu kami , kami melihat kesalahan runtime berikut:

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

4. Bagaimana Menangani NoSuchMethodError

Sekarang mari kita lihat bagaimana kita bisa menangani ini. Untuk kode di atas, mari kita lakukan kompilasi bersih penuh, termasuk kedua kelas tersebut. Kami akan melihat bahwa kesalahan akan tertangkap saat kami sedang kompilasi. Jika kami menggunakan IDE seperti Eclipse , itu akan terdeteksi lebih awal, segera setelah kami memperbarui SpecialsToday .

Karenanya jika kami mengalami kesalahan ini dengan aplikasi kami, sebagai langkah pertama, kami akan melakukan kompilasi bersih penuh. Dengan maven, kita akan menjalankan perintah mvn clean install .

Terkadang masalahnya ada pada ketergantungan eksternal aplikasi kita. Dalam kasus ini, pertama-tama kita akan memeriksa urutan jar di jalur build yang ditarik oleh classpath loader. Dan kami akan melacak dan memperbarui toples yang tidak konsisten.

Namun, jika kami masih menemukan kesalahan ini saat runtime, kami harus menggali lebih dalam. Kita harus memastikan bahwa kelas dan jar waktu kompilasi dan runtime memiliki versi yang sama . Untuk ini, kita dapat menjalankan aplikasi dengan opsi -verbose: class untuk memeriksa kelas yang dimuat. Kami dapat menjalankan perintah sebagai 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 informasi ini tentang semua kelas yang dimuat di masing-masing jar, selama waktu proses, kita dapat melacak ketergantungan yang tidak kompatibel.

Kita juga harus memastikan bahwa tidak ada kelas duplikat dalam dua atau lebih toples. Dalam kebanyakan kasus, maven akan membantu mengontrol dependensi yang berkonflik secara langsung. Selanjutnya, kita dapat menjalankan perintah mvn dependency: tree untuk mendapatkan pohon dependensi proyek kita sebagai 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

Kami dapat memeriksa perpustakaan dan versinya dalam daftar yang dihasilkan oleh perintah ini. Selain itu, kami juga dapat mengelola dependensi menggunakan tag maven. Menggunakantag, kita dapat mengecualikan ketergantungan yang bermasalah. Menggunakan tag, kita dapat mencegah dependensi yang tidak diinginkan untuk digabungkan dalam jar atau perang.

5. Kesimpulan

Pada artikel ini, kami membahas NoSuchMethodError . Kami membahas penyebab kesalahan ini dan juga cara menanganinya. Untuk detail lebih lanjut tentang cara menangani kesalahan dengan benar, silakan lihat artikel kami tentang menangkap kesalahan Java.

Seperti biasa, kode yang disajikan dalam artikel ini tersedia di GitHub.