Trong hướng dẫn này, chúng ta sẽ học cách sử dụng từ khóa throw và throws để xử lý ngoại lệ với sự trợ giúp của các ví dụ.

Trong Java, các ngoại lệ có thể được phân loại thành hai loại:

  • Trường hợp ngoại lệ được kiểm soát: Họ không kiểm tra tại thời gian biên dịch nhưng chạy time.For dụ: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, trường hợp ngoại lệ dưới lớp Error vv
  • Các ngoại lệ được kiểm tra : Chúng được kiểm tra tại thời điểm biên dịch. Ví dụ, IOException, InterruptedException vv

Tham khảo Các ngoại lệ của Java để tìm hiểu chi tiết về các ngoại lệ được chọn và không được chọn.

Thông thường, chúng ta không cần phải xử lý các ngoại lệ không được kiểm tra. Đó là bởi vì các ngoại lệ không được kiểm tra xảy ra do lỗi lập trình. Và, đó là một thực hành tốt để sửa chúng thay vì xử lý chúng.

Hướng dẫn này bây giờ sẽ tập trung vào cách xử lý các ngoại lệ đã kiểm tra bằng cách sử dụng throw và throws.

1. từ khóa throws trong Java

Chúng tôi sử dụng từ khóa throws trong khai báo phương thức để khai báo loại ngoại lệ có thể xảy ra trong nó.

Cú pháp của nó là:

accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … {
  // code
}

Như bạn có thể thấy từ cú pháp trên, chúng ta có thể sử dụng throws để khai báo nhiều ngoại lệ.

Ví dụ 1: từ khóa throw trong Java

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    // code that may produce IOException
    File newFile=new File("test.txt");
    FileInputStream stream=new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e){
      System.out.println(e);
    }
  }
}

Đầu ra

java.io.FileNotFoundException: test.txt (No such file or directory)

Khi chúng ta chạy chương trình này, nếu tệp test.txt không tồn tại, ném FileInputStream một FileNotFoundException mở rộng của lớp IOException.

Nếu một phương thức không xử lý các ngoại lệ, thì loại ngoại lệ có thể xảy ra bên trong nó phải được chỉ định trong mệnh đề throws để các phương thức trong ngăn xếp cuộc gọi có thể xử lý chúng hoặc chỉ định chúng bằng cách sử dụng từ khóa throws.

phương thức findFile() xác định rằng một IOException có thể được ném. Các phương thức main() gọi phương thức này và xử lý các ngoại lệ nếu nó được ném.

1.1 Nếm nhiều ngoại lệ

Đây là cách chúng ta có thể đưa ra nhiều ngoại lệ bằng cách sử dụng từ khóa throws.

import java.io.*;
class Main {
  public static void findFile() throws NullPointerException, IOException, InvalidClassException {
    
    // code that may produce NullPointerException
    … … … 

    // code that may produce IOException
    … … … 

    // code that may produce InvalidClassException 
    … … … 
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e1){
      System.out.println(e1.getMessage());
    } catch(InvalidClassException e2){
      System.out.println(e2.getMessage());
    }
  }
}

Tại đây, phương thức findFile() xác định rằng nó có thể ném NullPointerException, IOException và InvalidClassException trong throws.

Lưu ý rằng chúng ta đã không xử lý NullPointerException. Điều này là do nó là một ngoại lệ không được kiểm tra. Không nhất thiết phải ghi rõ nó trong mệnh đề throws và xử lý nó.

1.2 từ khóa throw Vs. try…catch…finally

Có thể có một số phương thức có thể gây ra ngoại lệ. Viết try…catch cho mỗi phương thức sẽ rất tẻ nhạt và mã trở nên dài và khó đọc.

throws cũng hữu ích khi bạn đã kiểm tra ngoại lệ (một ngoại lệ phải được xử lý) mà bạn không muốn mắc phải trong phương thức hiện tại của mình.

2. Từ khóa throw trong Java

Các từ khóa throw được sử dụng để ném một cách rõ ràng một ngoại lệ duy nhất.

Khi một ngoại lệ được ném ra, luồng thực thi chương trình sẽ chuyển từ khối try này sang khối catch khác. Chúng ta sử dụng từ khóa throw trong một phương thức.

Cú pháp của nó là:

throw throwableObject;

Một đối tượng có thể ném là một thể hiện của lớp Throwable hoặc lớp con của lớp Throwable.

Ví dụ 2: Từ khóa throw Java

class Main {
  public static void divideByZero() {
    throw new ArithmeticException("Trying to divide by 0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}

Đầu ra

Exception in thread "main" java.lang.ArithmeticException: Trying to divide by 0
    at Main.divideByZero(Main.java:3)
    at Main.main(Main.java:7)
exit status 1

Trong ví dụ này, chúng tôi rõ ràng đang ném một ArithmeticException.

Lưu ý: ArithmeticException là một ngoại lệ không được kiểm tra. Thường không cần thiết phải xử lý các trường hợp ngoại lệ không được chọn.

Ví dụ 3: Ném ngoại lệ đã kiểm tra

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    throw new IOException("File not found");
  }

  public static void main(String[] args) {
    try {
      findFile();
      System.out.println("Rest of code in try block");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

Đầu ra

File not found

phương thức findFile() ném một IOException với thông điệp chúng ta được truyền cho constructor của nó.

Lưu ý rằng vì nó là một ngoại lệ đã được kiểm tra, chúng ta phải chỉ định nó trong mệnh đề throws.

phương thức findFile() này cần phải xử lý ngoại lệ này hoặc chỉ định nó bằng từ khóa throws.

Chúng ta đã xử lý ngoại lệ này trong phương thức main(). Luồng thực thi chương trình chuyển từ khối try này sang khối catch khác khi một ngoại lệ được ném ra. Vì vậy, phần còn lại của mã trong khối try được bỏ qua và các câu lệnh trong khối catch được thực thi.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!