1. Từ khóa throw trong Java

Như ta đã biết Java đã định nghĩa sẵn các class Exception như ArithaturesException, NullPulumException, ArrayIndexOutOfBound,… Những Exception này được dùng để catch các trường hợp khác nhau. Từ đây ta có thể dùng từ khóa Throw để ném một Exception. Từ khóa Throw giúp ta ném ra một Exception một cách tường minh. Ta có thể ném Checked Exception hay Unchecked Exception bởi từ khóa Throw. Nhưng đa phần Throw dùng để ném ra ngoại lệ tùy chỉnh(Custom Exception), nghĩa là ngoại lệ này do người dùng tự định nghĩa.

Chúng ta có thể xác định tập hợp các điều kiện của riêng mình và đưa ra ngoại lệ một cách rõ ràng bằng cách sử dụng Throw. Từ khóa Throw sẽ truyền một cách rõ ràng trường hợp ngoại lệ. Khi một ngoại lệ được truyền bằng cách sử dụng Throw, một luồng thực thi chương trình sẽ chuyển đổi từ khối try sang khối catch .

Ta có thể ném một Throw bằng cú pháp sau:

throw exception

Hoặc:

throw new exception_class("error message");

Ví dụ: ta có thể ném ra ngoại lệ ArithmeticException

throw new ArithmeticException("Không được phép chia cho 4 trong chương trình");

2. Ví dụ về sử dụng throw trong Java

Ví dụ về đưa ra ngoại lệ ArithmeticException nếu tuổi dưới 18 thì không được phép truy cập

public class Main {
  static void checkAge(int age) { 
    if (age < 18) {
      throw new ArithmeticException("Quyền truy cập bị từ chối - Bạn phải từ 18 tuổi trở lên."); 
    } else {
      System.out.println("Đã cấp quyền truy cập - Bạn đủ tuổi!"); 
    }
 } 
 
 public static void main(String[] args) { 
   checkAge(15); 
 } 
}

Kết quả

Exception in thread "main" java.lang.ArithmeticException: Quyền truy cập bị từ chối - Bạn phải từ 18 tuổi trở lên.
    at Main.checkAge(Main.java:4)
    at Main.main(Main.java:11)

Ở đây ta chỉ đơn giản dùng một vòng lặp if else đưa ra điều kiện. Nếu tuổi nhỏ hơn 18 thì sẽ bị từ chối truy cập. Ngược lại nếu từ 18 tuổi trở lên thì được cung cấp quyền truy cập. Ở đây ta đã nhập tuổi là 15 và bị từ chối truy cập.

Một ví dụ khác về IOException

import java.io.*;

class Main {
    public static void ghi_file() throws IOException {
        throw new IOException("File không tồn tại");
    }
    public static void main(String[] args) {
        try {
            ghi_file();
        }
        catch (IOException a) {
            System.out.println(a.getMessage());
        }
    }
}

Kết quả

File không tồn tại!

Phương thức ghi_file() sẽ truyền một IOException với thông điệp mà chúng ta đã chuyển tới phương thức khởi tạo 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 đề Throw. Các phương thức gọi phương thức ghi_file() này cần phải xử lý ngoại lệ này hoặc chỉ định nó bằng cách sử dụng chính 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 sẽ chuyển từ khối Try sang khối Catch khi một ngoại lệ được truyền bằng Throw. Vì vậy, phần còn lại của đoạn mã trong khối Try bị bỏ qua và các câu lệnh trong khối Catch được thực thi.