Hãy để chúng tôi phỏng vấn Câu hỏi. Có một phương thức ném NullPointerException trong lớp cha. Chúng ta có thể ghi đè nó bằng một phương thức ném RuntimeException không?
Để trả lời câu hỏi này, hãy cho chúng tôi biết ngoại lệ Không được kiểm tra và Đã kiểm tra là gì.
Các ngoại lệ được kiểm tra phải được bắt hoặc truyền bá rõ ràng như được mô tả trong Xử lý ngoại lệ cơ bản thử-bắt-cuối cùng. Các trường hợp ngoại lệ không được chọn không có yêu cầu này. Họ không cần phải bị bắt hoặc bị tuyên bố ném.
Các ngoại lệ được kiểm tra trong Java mở rộng lớp java.lang.Exception. Các ngoại lệ không được kiểm tra sẽ mở rộng ngoại lệ java.lang.RuntimeException.
public class NullPointerException mở rộng RuntimeException
Các ngoại lệ không được kiểm tra sẽ mở rộng ngoại lệ java.lang.RuntimeException. Đó là lý do tại sao NullPointerException là một ngoại lệ Chưa được đánh dấu.
Hãy lấy một ví dụ: Ví dụ 1:
public class Parent {
public void name() throws NullPointerException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws RuntimeException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
Chương trình sẽ biên dịch thành công. Ví dụ 2:
public class Parent {
public void name() throws RuntimeException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws NullPointerException {
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
parent.name();// output => child
}
}
Chương trình cũng sẽ biên dịch thành công. Do đó, hiển nhiên là không có gì xảy ra trong trường hợp ngoại lệ Không được kiểm tra. Bây giờ, chúng ta hãy xem điều gì sẽ xảy ra trong trường hợp Ngoại lệ được kiểm tra. Ví dụ 3: Khi lớp cơ sở và lớp con đều ném một ngoại lệ đã kiểm tra
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws IOException{
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();// output=> child
}catch( Exception e) {
System.out.println(e);
}
}
}
Chương trình sẽ biên dịch thành công. Ví dụ 4: Khi phương thức lớp con ném ngoại lệ đã kiểm tra đường viền so với cùng một phương thức của lớp cơ sở.
import java.io.IOException;
public class Parent {
public void name() throws IOException {
System.out.println(" this is parent");
}
}
public class Child extends Parent{
public void name() throws Exception{ // broader exception
System.out.println(" child ");
}
public static void main(String[] args) {
Parent parent = new Child();
try {
parent.name();//output=> Compilation failure
}catch( Exception e) {
System.out.println(e);
}
}
}
Chương trình sẽ không biên dịch được. Vì vậy, chúng ta phải cẩn thận khi sử dụng Checked exceptions.