Rumah >Java >javaTutorial >NoSuchFieldException di Java - Apa yang perlu dilakukan jika medan tidak ditemui?
Apabila menulis program dalam Java, selalunya perlu menggunakan mekanisme pantulan untuk mendapatkan maklumat objek. Semasa proses pantulan, anda mungkin menghadapi pengecualian NoSuchFieldException, yang menunjukkan bahawa medan yang ditentukan tidak dapat ditemui. Jadi, apakah yang perlu kita lakukan apabila kita menghadapi anomali seperti ini?
Pertama, mari kita fahami sumber pengecualian NoSuchFieldException.
NoSuchFieldException ialah kelas pengecualian masa jalan dalam bahasa pengaturcaraan Java, yang menunjukkan bahawa medan yang ditentukan tidak boleh ditemui semasa refleksi. Jika kita menggunakan mekanisme refleksi dan medan yang ditentukan tidak wujud dalam kelas sasaran, NoSuchFieldException akan dilemparkan.
Berikut adalah contoh program mudah:
public class Test { public static void main(String[] args) { try { Class clazz = Class.forName("com.example.Person"); Field field = clazz.getField("name"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
Dalam program ini, kami cuba mendapatkan medan bernama nama dalam kelas Person. Jika medan ini tidak wujud dalam kelas Person, NoSuchFieldException akan dilemparkan.
Jadi, apakah yang perlu kita lakukan apabila kita menghadapi NoSuchFieldException? Berikut adalah beberapa cara untuk menanganinya.
Apabila menggunakan kaedah getField untuk mendapatkan medan, parameter yang diluluskan ialah nama medan. Jika nama yang dihantar tidak konsisten dengan nama medan sebenar, NoSuchFieldException akan dibuang. Oleh itu, kita boleh menyemak sama ada nama medan dieja dengan betul.
Sudah tentu, jika kami menggunakan kaedah getDeclaredField untuk mendapatkan medan, kami tidak perlu mempertimbangkan kebenaran akses medan tersebut. Walau bagaimanapun, untuk kelas dengan perhubungan warisan yang kompleks, kaedah ini mungkin memperoleh medan dengan nama yang sama dalam kelas induk atau subkelas lain, jadi ia perlu digunakan dengan berhati-hati.
Apabila kita mendapat medan, kita perlu menentukan kelas yang menjadi miliknya melalui objek Kelas. Jika nama kelas atau laluan pakej yang kami lalui tidak betul, ClassNotFoundException akan dilemparkan. Oleh itu, kita boleh menyemak sama ada nama dan laluan pakej kelas yang dimiliki adalah betul.
Jika kita cuba mendapatkan medan persendirian atau medan yang dilindungi, IllegalAccessException akan dilemparkan. Pada masa ini, kita boleh menyelesaikan masalah ini dengan menetapkan kaedah setAccessible. setAccessible boleh menetapkan sama ada akses kepada medan dibenarkan, walaupun ia peribadi atau dilindungi.
Berikut ialah contoh program:
public class Test { public static void main(String[] args) { try { Class clazz = Class.forName("com.example.Person"); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
Dalam program ini, kami menggunakan kaedah getDeclaredField untuk mendapatkan medan dan menetapkannya supaya boleh diakses melalui kaedah setAccessible. Dengan cara ini, walaupun medan itu tertutup atau dilindungi, kita boleh berjaya mendapatkannya.
Apabila menggunakan mekanisme pantulan, anda mungkin menghadapi pelbagai pengecualian. NoSuchFieldException ialah salah satu daripadanya Apabila kita menghadapi pengecualian ini, kita boleh cuba menyemak ejaan nama medan, nama dan laluan pakej kelas yang dimilikinya, dan kebenaran akses medan untuk mencari masalah dan menyelesaikannya. .
Atas ialah kandungan terperinci NoSuchFieldException di Java - Apa yang perlu dilakukan jika medan tidak ditemui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!