Rumah >Java >javaTutorial >Bolehkah Kaedah Java Overridden Melemparkan Pengecualian Disemak Lebih Luas Daripada Kaedah Induknya?
Melontar Pengecualian dalam Kaedah Ditindih
Di Java, kaedah mengatasi mewarisi pengecualian yang diisytiharkan oleh kaedah induknya. Walau bagaimanapun, terdapat sekatan tertentu pada jenis pengecualian yang boleh dilemparkan dengan kaedah mengatasi.
Secara khusus, kaedah mengatasi tidak boleh membuang pengecualian yang diperiksa yang lebih luas atau baharu berbanding dengan yang diisytiharkan oleh kaedah yang ditindih. Ini bermakna jika kaedah mengisytiharkan untuk membuang pengecualian tertentu, kaedah mengatasi hanya boleh membuang pengecualian itu atau subkelasnya.
Penaakulan
Sekatan ini membantu mengekalkan Liskov Prinsip Penggantian, yang menyatakan bahawa objek subkelas seharusnya dapat menggantikan objek kelas induk tanpa mengganggu tingkah laku program. Jika kaedah yang mengatasi boleh membuang pengecualian yang lebih luas daripada kaedah yang ditindih, ia akan melanggar prinsip ini dan boleh membawa kepada tingkah laku yang tidak dijangka.
Contoh
Pertimbangkan kod berikut:
class A { public void foo() throws IOException { ... } } class B extends A { @Override public void foo() throws SocketException { ... } }
Dalam contoh ini, kaedah foo() dalam kelas A mengisytiharkan untuk membuang IOException. Kaedah utama dalam kelas B membuang SocketException, yang merupakan subkelas IOException. Ini dibenarkan.
Walau bagaimanapun, jika kaedah foo() dalam kelas B membuang SQLException, yang tidak berkaitan dengan IOException, ia tidak akan dibenarkan. Ini akan melanggar peraturan bahawa kaedah overriding tidak boleh membuang pengecualian yang lebih luas daripada kaedah overridden.
Implikasi
Peraturan ini memberi kesan kepada reka bentuk kaedah overridden, kerana ia mengehadkan pengecualian yang boleh dibuang dengan kaedah mengatasi. Pembangun mesti mempertimbangkan dengan teliti pengecualian yang diisytiharkan oleh kaedah yang diganti apabila mengatasinya untuk mengelakkan ralat pengkompil dan pengecualian masa jalan.
Atas ialah kandungan terperinci Bolehkah Kaedah Java Overridden Melemparkan Pengecualian Disemak Lebih Luas Daripada Kaedah Induknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!