Khóa học java

Exception handling với overriding method

0 phút đọc

Trong Java, khi bạn ghi đè một phương thức của lớp cha trong lớp con, có một số quy tắc liên quan đến xử lý ngoại lệ (exception handling) mà bạn cần phải tuân theo. Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử lý ngoại lệ khi ghi đè phương thức trong Java.

Nếu phương thức của lớp cha không khai báo một exception

Nếu phương thức của lớp cha không khai báo một exception (ngoại lệ), thì phương thức ghi đè của lớp con không thể khai báo Checked Exception (ngoại lệ kiểm tra) nào cả. Dưới đây là một ví dụ:

import java.io.*;

class Parent {
  void msg() {
    System.out.println("parent");
  }
}

class TestExceptionChild extends Parent {
  void msg() throws IOException { // Compile Time Error: Cannot throw more general exception
    System.out.println("TestExceptionChild");
  }

  public static void main(String args[]) {
    Parent p = new TestExceptionChild();
    p.msg();
  }
}

Kết quả

Compile Time Error: Cannot throw more general exception

Trong ví dụ này, phương thức msg() của lớp cha Parent không khai báo exception nào, nhưng phương thức msg() của lớp con TestExceptionChild cố gắng khai báo IOException (một checked exception). Điều này dẫn đến lỗi tại thời điểm biên dịch.

Tuy nhiên, trong trường hợp này, lớp con có thể khai báo Unchecked Exception, như ArithmeticException.

import java.io.*;

class Parent {
  void msg() {
    System.out.println("parent");
  }
}

class TestExceptionChild1 extends Parent {
  void msg() throws ArithmeticException { // OK to throw Unchecked Exception
    System.out.println("child");
  }

  public static void main(String args[]) {
    Parent p = new TestExceptionChild1();
    p.msg();
  }
}

Kết quả

child

Nếu phương thức lớp cha khai báo một exception

Nếu phương thức lớp cha khai báo một exception, thì phương thức ghi đè của lớp con có thể khai báo cùng exception đó, exception của lớp con, hoặc không khai báo exception nào. Nhưng nó không thể khai báo exception cha. Dưới đây là một số ví dụ:

Phương thức ghi đè của lớp con khai báo exception cha

import java.io.*;

class Parent {
  void msg() throws ArithmeticException {
    System.out.println("parent");
  }
}

class TestExceptionChild2 extends Parent {
  void msg() throws Exception { // Compile Time Error: Exception is broader than ArithmeticException
    System.out.println("child");
  }

  public static void main(String args[]) {
    Parent p = new TestExceptionChild2();
    try {
      p.msg();
    } catch (Exception e) {}
  }
}

Kết quả

Compile Time Error: Exception is broader than ArithmeticException

Phương thức ghi đè của lớp con khai báo exception của lớp con

import java.io.*;

class Parent {
  void msg() throws Exception {
    System.out.println("parent");
  }
}

class TestExceptionChild4 extends Parent {
  void msg() throws ArithmeticException {
    System.out.println("child");
  }

  public static void main(String args[]) {
    Parent p = new TestExceptionChild4();
    try {
      p.msg();
    } catch (Exception e) {}
  }
}

Kết quả:

Kết quả

child

Phương thức ghi đè của lớp con không khai báo exception nào

import java.io.*;

class Parent {
  void msg() throws Exception {
    System.out.println("parent");
  }
}

class TestExceptionChild5 extends Parent {
  void msg() {
    System.out.println("child");
  }

  public static void main(String args[]) {
    Parent p = new TestExceptionChild5();
    try {
      p.msg();
    } catch (Exception

 e) {}
  }
}

Kết quả

child

Trong trường hợp này, phương thức ghi đè của lớp con không khai báo bất kỳ exception nào, và việc sử dụng try...catch trong main là để bắt và xử lý các exception (nếu có) từ phương thức của lớp cha.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Giải thích cách microservice giao tiếp với các phần khác?

entry

Những lợi ích của Laravel so với các framework PHP khác là gì?

junior

What will happen to the Exception object after exception handling?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào