Memahami Pengisytiharan Pengecualian Kaedah Overriding
Di Java, apabila mengatasi kaedah dalam subkelas, kaedah overriding mesti mematuhi peraturan tertentu mengenai throw pengecualian. Khususnya, kaedah mengatasi tidak boleh membuang pengecualian yang ditandai yang baharu atau lebih luas daripada yang diisytiharkan oleh kaedah yang ditindih.
Sebagai contoh, jika kaedah kelas asas mengisytiharkan untuk membuang FileNotFoundException, kaedah mengatasi dalam subkelas tidak boleh membuang SQLException, Exception atau sebarang pengecualian bukan masa jalan lain yang bukan subkelas FileNotFoundException.
Penaakulan Di Sebalik Sekatan
Sekatan ini berpunca daripada prinsip polimorfisme dan Prinsip Penggantian Liskov (LSP). LSP menyatakan bahawa subkelas harus digantikan untuk kelas asasnya dalam semua keadaan, supaya tingkah laku program kekal betul.
Jika kaedah mengatasi dibenarkan untuk membuang pengecualian yang lebih luas, ia akan melanggar LSP. Sebagai contoh, jika kaedah kelas asas foo() mengisytiharkan untuk membuang IOException, dan kaedah mengatasi mengisytiharkan untuk membuang SQLException, pengkompil tidak lagi akan memaksa pemanggil untuk mengendalikan IOException.
Walau bagaimanapun, apabila subkelas dianggap sebagai kelas asasnya, pemanggil mungkin tidak mengharapkan atau bersedia untuk mengendalikan pengecualian yang lebih luas yang dilemparkan oleh kaedah mengatasi. Ini akan membawa kepada pengecualian masa jalan dan tingkah laku yang tidak dapat diramalkan.
Contoh
Pertimbangkan kod berikut:
class A { public void foo() throws IOException {..} } class B extends A { @Override public void foo() throws SocketException {..} // allowed @Override public void foo() throws SQLException {..} // NOT allowed }
Dalam contoh ini, kaedah mengatasi dalam kelas B boleh membuang SocketException kerana ia adalah subkelas IOException. Walau bagaimanapun, ia tidak boleh membuang SQLException kerana SQLException bukan subkelas IOException.
Pengecualian Tidak Ditanda
Pengecualian yang tidak disemak tidak tertakluk kepada sekatan ini. Ia boleh dilontar dengan kaedah mengatasi tanpa mengira sama ada ia diisytiharkan dalam klausa lontaran kaedah yang ditindih.
Atas ialah kandungan terperinci Bolehkah Kaedah Subkelas Melemparkan Pengecualian Diperiksa Lebih Luas Daripada Kaedah Superclassnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!