ให้เราทำคำถามสัมภาษณ์ มีวิธีการที่พ่น NullPointerException ใน superclass เราสามารถแทนที่ด้วยวิธีการที่พ่น RuntimeException ได้หรือไม่?
หากต้องการตอบคำถามนี้โปรดแจ้งให้เราทราบว่าข้อยกเว้นที่ไม่ได้ตรวจสอบและถูกตรวจสอบคืออะไร
ข้อยกเว้นที่ตรวจสอบแล้วจะต้องถูกจับหรือเผยแพร่อย่างชัดเจนตามที่อธิบายไว้ในการจัดการข้อยกเว้นการลองจับขั้นพื้นฐาน ข้อยกเว้นที่ไม่เลือกไม่มีข้อกำหนดนี้ พวกเขาไม่ต้องถูกจับหรือถูกประกาศว่าโยน
ตรวจสอบข้อยกเว้นใน Java ขยายคลาส java.lang.Exception ข้อยกเว้นที่ไม่ได้เลือกจะขยาย java.lang.RuntimeException
คลาสสาธารณะ NullPointerException ขยาย RuntimeException
ข้อยกเว้นที่ไม่ได้เลือกจะขยาย java.lang.RuntimeException นี่คือเหตุผลที่ NullPointerException เป็นข้อยกเว้นที่ไม่ได้ทำเครื่องหมาย
ลองดูตัวอย่าง: ตัวอย่างที่ 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
}
}
โปรแกรมจะคอมไพล์สำเร็จ ตัวอย่างที่ 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
}
}
โปรแกรมจะคอมไพล์สำเร็จด้วย ดังนั้นจึงเห็นได้ชัดว่าไม่มีอะไรเกิดขึ้นในกรณีของข้อยกเว้นที่ไม่ได้ตรวจสอบ ตอนนี้เรามาดูว่าเกิดอะไรขึ้นในกรณีของข้อยกเว้นที่ตรวจสอบแล้ว ตัวอย่างที่ 3: เมื่อคลาสพื้นฐานและคลาสย่อยทั้งสองแสดงข้อยกเว้นที่ถูกตรวจสอบ
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);
}
}
}
โปรแกรมจะคอมไพล์สำเร็จ ตัวอย่างที่ 4: เมื่อเมธอดคลาสลูกโยนข้อยกเว้นที่ตรวจสอบเส้นขอบเทียบกับเมธอดคลาสพื้นฐานเดียวกัน
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);
}
}
}
โปรแกรมจะคอมไพล์ไม่สำเร็จ ดังนั้นเราต้องระมัดระวังเมื่อเราใช้ข้อยกเว้นที่ตรวจสอบแล้ว