1. Gambaran keseluruhan
Dalam artikel ini, kami akan menunjukkan sebab di sebalik NoSuchFieldError dan mengetahui cara menyelesaikannya.
2. NoSuchFieldError
Seperti namanya, NoSuchFieldError berlaku apabila medan yang ditentukan tidak ada. NoSuchFieldError memperluas kelas IncompatibleClassChangeError dan dilemparkan ketika aplikasi cuba mengakses atau mengubah medan objek atau medan statik kelas tetapi objek atau kelas tidak lagi memiliki bidang itu .
Kelas IncompatibleClassChangeError memperluas kelas LinkageError dan berlaku apabila kita melakukan perubahan definisi kelas yang tidak serasi. Akhirnya, LinkageError memanjangkan Ralat dan menunjukkan bahawa kelas mempunyai beberapa kebergantungan pada kelas yang lain yang tidak berubah.
Mari kita lihat kesalahan ini dalam tindakan dengan bantuan contoh. Sebagai langkah pertama, mari buat kelas Dependency :
public class Dependency { public static String message = "Hello Baeldung!!"; }
Kemudian kami akan membuat kelas FieldErrorExample yang merujuk kepada bidang kelas Ketergantungan kami :
public class FieldErrorExample { public static String getDependentMessage() { return Dependency.message; } }
Mari juga tambahkan kod untuk memeriksa sama ada kita mendapat mesej dari kelas Dependency :
public static void fetchAndPrint() { System.out.println(getDependentMessage()); }
Sekarang, kita dapat menyusun fail-fail ini menggunakan perintah javac , dan setelah pelaksanaan kelas FieldErrorExample menggunakan perintah java , ia akan mencetak pesan yang ditentukan .
Namun, jika kita memberi komen, membuang, atau mengubah nama atribut di kelas Dependency dan mengkompilasi ulang, maka kita akan mengalami kesalahan kita .
Sebagai contoh, mari ubah nama atribut di kelas Ketergantungan kami :
public class Dependency { public static String msg = "Hello Baeldung!!"; }
Sekarang, jika kita mengompilasi semula kelas Dependency kita , dan kemudian melaksanakan FieldErrorExample sekali lagi, kita akan menemui NoSuchFieldError :
Exception in thread "main" java.lang.NoSuchFieldError: message
Kesilapan di atas berlaku kerana FieldErrorExample kelas masih merujuk kepada bidang statik mesej daripada Dependency kelas, tetapi ia tidak lagi wujud - kami telah membuat perubahan yang tidak serasi kepada Dependency kelas.
3. Menyelesaikan Kesalahan
Untuk mengelakkan ralat ini, kita perlu membersihkan dan menyusun fail yang ada . Kita boleh melakukan ini menggunakan perintah javac atau dengan Maven dengan menjalankan pemasangan bersih mvn. Dengan melakukan langkah ini, kita akan mempunyai semua fail yang disusun terkini, dan kita tidak akan mengalami kesalahan.
Sekiranya ralat berlanjutan, maka masalahnya mungkin banyak fail JAR: satu semasa menyusun, dan yang lain semasa berjalan. Ini sering berlaku apabila aplikasi bergantung pada JAR luaran. Di sini, kita harus mengesahkan susunan JAR di jalan binaan untuk mengenal pasti JAR yang tidak konsisten.
Sekiranya kita harus menyiasat lebih lanjut, ada baiknya menjalankan aplikasi dengan pilihan -verbose: class untuk memeriksa kelas yang dimuat. Ini dapat membantu kita mengenal pasti kelas usang.
Kadang-kadang JAR pihak ketiga secara dalaman merujuk kepada versi lain, yang mengakibatkan NoSuchFieldError . Sekiranya ini berlaku, kita boleh menggunakan ketergantungan mvn: tree -Dverbose. Ini menghasilkan pokok kebergantungan maven dan membantu kita dalam mengenal pasti JAR yang tidak konsisten.
4. Kesimpulan
Dalam tutorial ringkas ini, kami telah menunjukkan mengapa NoSuchFieldError berlaku dan melihat bagaimana kita dapat menyelesaikannya.
Seperti biasa, kodnya tersedia di GitHub.