Ngoại lệ là sự kiện bất ngờ xảy ra trong quá trình thực thi chương trình. Khi mã gặp ngoại lệ, luồng chương trình sẽ bị chấm dứt.
Quan trọng phải xử lý ngoại lệ đúng cách khi lập trình Java. Nghiêng, mã có thể chấm dứt trong quá trình thực thi và ảnh hưởng trải nghiệm người dùng cuối.
Đó là lúc từ khóa throw và throws xuất hiện. Từ khóa throw và throws của Java dùng xử lý ngoại lệ trong Java. Hướng dẫn này sẽ thảo luận, kèm ví dụ, cách dùng các từ khóa này trong Java.
Ngoại Lệ Trong Java
Trong Java, có hai sự kiện ảnh hưởng luồng chương trình: lỗi (errors) và ngoại lệ (exceptions).
Sự kiện đầu là lỗi, đại diện vấn đề trong Máy ảo Java như rò rỉ bộ nhớ, hệ thống hết bộ nhớ, vấn đề tương thích thư viện. Khi gặp lỗi, chương trình khó khôi phục. Tuy nhiên, lỗi thường ngoài kiểm soát của lập trình viên, nên trong Java không xử lý lỗi.
Ngoại lệ là loại sự kiện thứ hai ảnh hưởng chương trình. Ngoại lệ có thể bắt (caught) và xử lý trong mã. Khi gặp ngoại lệ, đối tượng tạo ra chứa thông tin về ngoại lệ, dùng để nói cho mã biết gì nên xảy ra nếu gặp ngoại lệ.
Một số lý do ngoại lệ xảy ra bao gồm:
- Lỗi trong mã
- Mở file không tồn tại
- Đầu vào người dùng không hợp lệ
- Mất kết nối mạng
Có hai loại ngoại lệ cần biết trước khi bắt đầu xử lý ngoại lệ:
- Ngoại lệ không kiểm tra (unchecked exceptions) kiểm tra tại runtime. Bao gồm
ArithmeticExceptionvàArrayIndexOutOfBoundsException. - Ngoại lệ kiểm tra (checked exceptions) kiểm tra tại compile-time, bao gồm
IOExceptionvàInterruptedException.
Phần lớn, bạn muốn xử lý ngoại lệ kiểm tra trong mã. Vì ngoại lệ không kiểm tra thường do lỗi lập trình, hơn là hành vi bất ngờ trong mã.
Từ Khóa Throws Trong Java
Từ khóa throws Java dùng khai báo loại ngoại lệ có thể phát sinh trong khối mã. Cú pháp mệnh đề throws:
accessModifier return functionName() throws Exception1, Exception2 { // Run code }
Hãy dùng ví dụ minh họa cách hoạt động. Giả sử xây dựng chương trình rạp chiếu phim kiểm tra tuổi khách xem phim trên 16 tuổi. Nếu khách dưới 16, không được vào xem; nếu 16 trở lên, được phép vào.
Mã kiểm tra tuổi khách và ném ngoại lệ ArithmeticException nếu khách dưới 16:
class Main { public static void verifyAge(int age) throws ArithmeticException { if (age < 16) { throw new ArithmeticException("This customer is not old enough to see the movie."); } else { System.out.println("This customer is old enough to see the movie."); } } public static void main(String[] args) { verifyAge(14); } }
Mã trả về:
Exception in thread “main” java.lang.ArithmeticException: This customer is not old enough to see the movie.
at Main.verifyAge(Main.java:4)
at Main.main(Main.java:11)
Khi chạy chương trình, tham số age chỉ định trong chương trình chính đặt thành 14. Nhỏ hơn 16, nên khi phương thức verifyAge() thực thi, câu lệnh age < 16 đánh giá true, và ArithmeticException được ném.
Từ khóa throws dùng định nghĩa loại ngoại lệ phương thức verifyAge() trả về. Từ khóa throw dùng ném ngoại lệ trong chương trình.
Từ Khóa Throw Trong Java
Từ khóa throw Java dùng ném một ngoại lệ đơn lẻ trong mã. Từ khóa throw theo sau bởi đối tượng sẽ ném trong chương trình nếu gặp ngoại lệ.
Cú pháp từ khóa throw Java:
throw throwObject;
Hãy đi qua vài ví dụ câu lệnh throw dùng xử lý ngoại lệ trong Java.
Ném Ngoại Lệ Kiểm Tra (Checked Exception)
Giả sử muốn thông báo This file does not exist. xuất hiện khi IOException gặp trong chương trình. IOExceptions là ngoại lệ kiểm tra, nên xử lý bằng từ khóa “throw”. Mã xử lý ngoại lệ:
import java.io.*; class Main public static void getFile() throws IOException { throw new IOException("This file does not exist."); } public static void main(String[] args) { try { getFile(); } catch (IOException error) { System.out.println(e.getMessage()); } } }
Mã trả về:
This file does not exist.
Phân tích mã: Đầu tiên nhập thư viện java.io , dùng trong mọi chương trình xử lý file. Sau đó tạo lớp Main chứa mã chương trình.
Trong lớp Main, định nghĩa hàm getFile() ném IOException. Hàm này ném IOException kèm thông báo “This file does not exist.” cho chương trình.
Trong hàm main lớp Main, tạo khối try/catch thử thực thi phương thức getFile(). Nếu IOException gặp, mã trong khối catch thực thi, và thông báo từ IOException in ra bảng điều khiển. Vì vậy mã trả về “This file does not exist.”, là thông báo khai báo trước.
Ném Ngoại Lệ Không Kiểm Tra (Unchecked Exception)
Giả sử muốn ném ngoại lệ StringIndexOutOfBounds nếu chương trình thử truy cập chỉ số chuỗi không tồn tại. Có thể làm bằng mã:
class Main { public static void outOfBounds() { throw new StringIndexOutOfBoundsException("This index value is invalid."); } public static void main(String[] args) { outOfBounds(); } }
Có nhiều chuyện xảy ra trong mã, hãy phân tích. Đầu tiên khai báo lớp Main chứa mã chương trình.
Sau đó tạo hàm outOfBounds() khi thực thi sẽ ném ngoại lệ StringIndexOutOfBounds. Thông báo This index value is invalid. đi kèm ngoại lệ. Cuối cùng, trong chương trình chính, gọi hàm outOfBounds(), sau đó trả về:
Exception in thread “main” java.lang.StringIndexOutOfBoundsException: This index value is invalid.
at Main.outOfBounds(Main.java:3)
at Main.main(Main.java:7)
Trong ví dụ này, ném ngoại lệ không kiểm tra. Thường không cần thiết, như thảo luận trước, nhưng ném ngoại lệ không kiểm tra để chỉ ra cú pháp.
Kết Luận
Xử lý ngoại lệ kiểm tra là phần quan trọng viết mã dễ bảo trì trong Java. Trong Java, từ khóa throw và throws dùng ném và xử lý ngoại lệ.
Hướng dẫn này bao gồm cách dùng từ khóa throw và throws trong Java, cung cấp ví dụ liên quan giúp bạn học quy trình. Sau khi đọc hướng dẫn này, bạn sẵn sàng bắt đầu ném và xử lý ngoại lệ trong Java như chuyên gia!