Rumah > Java > javaTutorial > Bolehkah Kaedah Subkelas Melemparkan Pengecualian Diperiksa Lebih Luas Daripada Kaedah Superclassnya?

Bolehkah Kaedah Subkelas Melemparkan Pengecualian Diperiksa Lebih Luas Daripada Kaedah Superclassnya?

Linda Hamilton
Lepaskan: 2024-11-29 09:57:11
asal
968 orang telah melayarinya

Can a Subclass Method Throw Broader Checked Exceptions Than Its Superclass Method?

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan