Từ khóa Throw và Throws trong Java là một khái niệm quan trọng trong khi lập trình, được sử dụng để xử lý trường hợp ngoại lệ của chương trình. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách ứng dụng khái niệm này để xử lý ngoại lệ cùng với các ví dụ dẫn chứng.
Từ khóa Throw và Throws
Trong Java, các ngoại lệ có thể được phân loại thành hai loại:
- Ngoại lệ không được kiểm tra: Chúng không được kiểm tra tại thời điểm biên dịch mà tại thời gian chạy. Ví dụ: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException và ngoại lệ khác.
- 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, InterruptException,…
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 là do lỗi lập trình. Và ta nên cố gắng sửa lỗi thay vì xử lý lỗi. Ta sẽ tập trung vào cách xử lý các ngoại lệ được kiểm tra bằng cách sử dụng Throw và Throws.
Từ khóa Throws
Chúng ta sử dụng từ khóa Throws trong khai báo phương thức để khai báo kiểu loại ngoại lệ mà có thể xảy ra bên trong.
Cú pháp:
1 2 3 |
Chỉ_định_truy_cập kiểu_trả_về tên_phương_thức() throws Ngoại_lệ{ // Đoạn mã } |
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.io.*; class Main { public static void ghi_file() throws IOException { File f = new File("abc.txt"); FileInputStream stream=new FileInputStream(f); } public static void main(String[] args) { try{ ghi_file(); } catch(IOException a){ System.out.println(a); } } } |
Kết quả:
1 |
java.io.FileNotFoundException: abc.txt (No such file or directory) |
Khi chúng ta chạy chương trình, vì file abc.txt không tồn tại, FileInputStream sẽ truyền một ngoại lệ FileNotFoundException. Nếu một phương thức không xử lý các ngoại lệ, thì 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 đằng sau có thể xử lý hoặc xác định nó bằng cách sử dụng từ khóa throws. Phương thức ghi_file() chỉ định rằng một IOException có thể được truyền. Phương thức main() thực hiện lời gọi phương thức này và xử lý ngoại lệ nếu nó được truyền.
So sánh Throw và khối Try Catch Finally
Có thể có một số phương thức có thể gây ra ngoại lệ. Việc viết nhiều lần các khối lệnh Try Catch cho mỗi phương thức sẽ gây ra sự nhàm chán và đoạn mã trở nên dài và khó đọc. Throw sẽ hữu ích khi ta đã kiểm tra ngoại lệ (một ngoại lệ sẽ được xử lý), nhưng ta lại không muốn xử lý nó trong phương thức hiện tại. Mà muốn xử lý nó gộp chung vào một chỗ để đoạn mã ngắn gọn và không phải viết lại các khối lệnh xử lý các ngoại lệ nhiều lần.
Từ khóa Throw
Từ khóa Throw được sử dụng để truyền một cách rõ ràng một trường hợp ngoại lệ. Khi một ngoại lệ được truyền bằng cách sử dụng Throw, luồng thực thi chương trình sẽ chuyển từ khối Try sang khối Catch. Chúng ta sử dụng từ khóa Throw trong một phương thức.
Cú pháp:
1 |
Throw đối_tượng; |
Đối tượng là một thể hiện của lớp Throwable hoặc lớp con của lớp Throwable.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.io.*; class Main { public static void ghi_file() throws IOException { throw new IOException("File khong ton tai!"); } public static void main(String[] args) { try { ghi_file(); } catch (IOException a) { System.out.println(a.getMessage()); } } } |
Kết quả:
1 |
File khong ton tai! |
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.
Trên đây là khái niệm và ví dụ cơ bản về từ khóa Throw và Throws trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài tiếp theo trên tek4 nhé!
P/s: Cảm ơn mọi người!