Punca dan penyelesaian kepada pengecualian NoSuchMethodError dalam Java
Java ialah salah satu bahasa pengaturcaraan paling popular di dunia Ia mempunyai ciri-ciri merentas platform, berorientasikan objek dan keselamatan. Dalam pembangunan program Java, pelbagai pengecualian sering ditemui. Antaranya, pengecualian NoSuchMethodError juga merupakan salah satu pengecualian yang sangat biasa. Artikel ini akan memperkenalkan sebab dan penyelesaian pengecualian NoSuchMethodError.
1. Punca
Dalam pembangunan program Java, jika kaedah yang tidak wujud dipanggil, pengecualian NoSuchMethodError akan berlaku. Terdapat dua situasi:
1 Kaedah wujud pada masa penyusunan tetapi tidak dapat ditemui pada masa jalan
Semasa menyusun kod Java, pengkompil Java akan menyemak semua kaedah kelas Jika kaedah tidak wujud atau tandatangan tidak perlawanan, Kompilasi akan gagal. Tetapi pada masa jalan, apabila kod memanggil kaedah yang tidak wujud, pengecualian NoSuchMethodError dijana.
Sebagai contoh, kod berikut akan menghasilkan pengecualian NoSuchMethodError:
public class Test { public static void main(String[] args) { int sum = add(1, 2, 3); System.out.println(sum); } public static int add(int a, int b) { return a + b; } }
Dalam kod ini, kami memanggil kaedah tambah dalam kaedah utama dan lulus dalam tiga parameter, tetapi kaedah tambah hanya boleh menerima dua parameter, jadi Penyusunan akan gagal . Tetapi jika kita lulus dalam dua parameter sebaliknya, kompilasi akan lulus. Tetapi pada masa jalan, kerana kaedah tambah yang kami panggil lulus dalam tiga parameter, pengecualian NoSuchMethodError berlaku.
2. Terdapat kaedah semasa runtime, tetapi ia tidak dipanggil
Dalam program Java, jika kelas telah disusun ke dalam fail .class, tetapi tidak digunakan semasa runtime, JVM tidak akan memuatkan kelas, dan ia tidak akan digunakan Kaedah dalam kelas ini akan dipanggil. Walau bagaimanapun, jika anda perlu menggunakan kaedah dalam kelas ini kemudian dan kaedah ini telah diubah suai, pengecualian NoSuchMethodError akan dihasilkan.
Sebagai contoh, berikut ialah dua versi kelas:
public class Test { public static void main(String[] args) { A a = new A(); a.sayHello(); } } class A { public void sayHello() { System.out.println("Hello, World!"); } }
Versi lain:
public class Test { public static void main(String[] args) { A a = new A(); a.sayHello("Java"); } } class A { public void sayHello(String name) { System.out.println("Hello, " + name + "!"); } }
Jika kita menjalankan versi pertama kelas dahulu dan kemudian versi kedua kelas, pengecualian NoSuchMethodError akan dijana kerana The sayHello kaedah dalam versi kedua kelas telah berubah, tetapi JVM tidak memuatkan versi baharu kelas ini, tetapi memuatkan versi lama kelas, jadi pengecualian NoSuchMethodError akan dijana apabila versi baharu kaedah sayHello dipanggil .
2. Penyelesaian
Sebab pengecualian NoSuchMethodError berlaku adalah lebih rumit, jadi kami perlu menggunakan penyelesaian yang berbeza.
1. Kaedah wujud pada masa penyusunan tetapi tidak ditemui pada masa jalan
Jika kaedah wujud pada masa penyusunan tetapi tidak ditemui pada masa jalan, anda boleh menyelesaikan masalah dari aspek berikut:
(1) Sahkan sama ada kaedah wujud
Pastikan kaedah yang anda panggil benar-benar wujud. Anda boleh menggunakan refleksi untuk mengesahkan sama ada kaedah itu wujud, contohnya:
public class Test { public static void main(String[] args) throws Exception { Class cls = Class.forName("com.example.A"); Method method = cls.getMethod("add", int.class, int.class); System.out.println(method); } } class A { public int add(int a, int b) { return a + b; } }
Dalam kod ini, kami menggunakan refleksi untuk mendapatkan kaedah tambah dalam kelas A. Jika kaedah tambah tidak ditemui pada masa jalan, pengecualian akan dihasilkan.
(2) Semak sama ada tandatangan kaedah sepadan
Tandatangan kaedah ialah urutan unik aksara yang ditakrifkan untuk kaedah, biasanya termasuk nama kaedah, jenis parameter, jenis pulangan dan maklumat lain. Jika tandatangan kaedah pada masa penyusunan tidak konsisten dengan itu pada masa jalankan, pengecualian NoSuchMethodError akan dihasilkan.
(3) Sahkan sama ada kelas di mana kaedah terletak telah dimuatkan dengan betul
Pastikan kelas di mana kaedah terletak telah dimuatkan dengan betul. Anda boleh mengesahkan sama ada kelas dimuatkan dengan mencetak nama kelas yang layak sepenuhnya, contohnya:
public class Test { public static void main(String[] args) { A a = new A(); System.out.println(a.getClass().getName()); } } class A { public void sayHello() { System.out.println("Hello, World!"); } }
Dalam kod ini, kami mencetak nama kelas yang layak sepenuhnya di mana objek terletak untuk mengesahkan sama ada kelas itu dimuatkan dengan betul.
(4) Sahkan sama ada kelas di mana kaedah terletak telah diimport dengan betul
Pastikan kelas di mana kaedah terletak telah diimport dengan betul. Jika anda menyalin kod dari tempat lain tetapi tidak mengimport kelas yang sepadan dengan betul, pengecualian NoSuchMethodError akan berlaku.
2. Kaedah wujud pada masa jalan, tetapi tidak dipanggil
Jika kaedah wujud pada masa jalan, tetapi tidak dipanggil, anda boleh menyelesaikan masalah melalui kaedah berikut:
(1) Kosongkan cache
Pastikan dengan mengosongkan cache JVM memuatkan versi baharu kelas dengan betul. Dalam sistem Windows, anda boleh memasukkan arahan berikut dalam cmd untuk mengosongkan cache Java:
javaws -clearcache
(2) Kompil semula
Kompil semula kod dan jalankannya semula.
(3) Gunakan versi baharu kelas
Pastikan anda menggunakan versi baharu kelas dan bukannya versi lama kelas.
(4) Ubah suai nama kelas
Jika anda perlu mengubah suai nama kelas, disyorkan untuk mengubah suai semua kaedah dalam kelas pada masa yang sama untuk memastikan tiada pengecualian NoSuchMethodError berlaku dalam subkelas yang mewarisi ini kelas.
3. Summary
NoSuchMethodError pengecualian ialah masalah biasa dalam pembangunan program Java. Sebab masalah ini termasuk kaedah yang wujud pada masa penyusunan tetapi tidak dapat ditemui pada masa jalan, kaedah yang wujud pada masa jalan tetapi tidak dipanggil, dsb. Kaedah untuk menyelesaikan masalah ini terutamanya termasuk mengesahkan sama ada kaedah itu wujud, menyemak sama ada tandatangan kaedah sepadan, mengesahkan sama ada kelas tempat kaedah terletak dimuatkan dengan betul, mengesahkan sama ada kelas di mana kaedah terletak diimport dengan betul, dsb. Apabila membangunkan program Java, anda perlu memberi perhatian kepada perbezaan antara kompilasi dan masa jalan, dan memilih penyelesaian yang sesuai mengikut situasi tertentu.
Atas ialah kandungan terperinci Punca dan penyelesaian kepada pengecualian NoSuchMethodError di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!