Sau khi đọc Why can't overriding methods throw exceptions, tôi hiểu rằng nếu phương pháp khai báo là ném một ngoại lệ Kiểm tra, phương pháp trọng trong một lớp con chỉ có thể tuyên bố để ném rằng ngoại lệ hoặc lớp con của nó:Gọi phương pháp trọng mà ném Kiểm tra ngoại lệ
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
}
Vì vậy, vì SocketException
IS-A IOException
Tôi có thể khai báo phương thức ghi đè như ném bất kỳ lớp con nào của IOException
.
Trong chương trình của mình, tôi muốn gọi phương thức ghi đè được khai báo là ném FileNotFoundException
IS-A IOException
. cũng xử lý với một khối try-catch
import java.io.*;
class Sub extends Super{
public static void main (String [] args){
Super p = new Sub();
try {
p.doStuff();
}catch(FileNotFoundException e){
}
}
public void doStuff() throws FileNotFoundException{}
}
class Super{
public void doStuff() throws IOException{}
}
Nhưng tôi nhận được rằng lỗi thời gian biên dịch:
Sub.java:6: error: unreported exception IOException; must be caught or declared to be thrown
p.doStuff();
^
lý do cho điều đó là gì? Tôi hơi bối rối vì mọi thứ mà lớp Base cũng có sẵn cho các lớp con.
Cũng khó hiểu hơn nhiều là khả năng bắt Exception
và Throwable
Ngoài IOException
(Ngược lại với khái niệm ghi đè).
Một số người có thể bị chặn hình ảnh. Bạn cũng có thể sao chép dán lỗi biên dịch vào câu hỏi của mình không. – CKing
@CKing được thêm ngay bây giờ – Pauwelyn