Exception – Ngoại lệ
Một ngoại lệ (exception) là lỗi xảy ra khi chương trình thi hành. Ngoại lệ dẫn tới chương trình kết thúc. Bắt ngoại lệ (Exception handling) trong Java là cơ chế giúp bạn nhận được lỗi xảy ra và đưa ra cách xử lý theo tình huống mong muốn.
Một ngoại lệ có thể xảy ra do nhiều nguyên nhân khác nhau, ví dụ
- Người dùng nhập sai dữ liệu quy định
- Một file nào đó cần mở mà lại không có
- Kết nối mạng bị mất khi cần truyền dữ liệu
- Bộ nhớ bị thiếu
Như bạn thấy, ngoại lệ có thể là do lỗi từ người dùng, lỗi từ lập trình viên, lỗi do hệ thống vật lý… Rất nhiều ngoại lệ, nếu bạn có thể bắt và loại trừ được tất cả các ngoại lệ thì là một lập trình viên hoàn hảo
Bắt ngoại lệ
Các ngoại lệ có thể bắt bằng cách kết hợp cặp từ khóa try và catch. try/catch bao bọc lấy khối lệnh cần bắt ngoại lệ.
try { //code cần bắt lỗi ở đây } catch (Exception e) { //code xử lý khi bắt được lỗi e }
Trong khối catch có khai báo kiểu ngoại lệ cần bắt (Exception e). Nếu ngoại lệ có xảy ra ở khối try thì ngoại lệ sẽ chuyển đến khối catch. Kiểu có ngoại lệ có tên Exception có thể dùng cho tất cả các ngoại lệ.
Ví dụ sau bắt lỗi nếu truy cập chỉ số không tồn tại trong mảng
public class MyClass { public static void main(String[ ] args) { try { int a[ ] = new int[2]; System.out.println(a[5]);//truy cập phần tử ngoài mảng } catch (Exception e) { System.out.println("Lỗi xảy ra"); } } } //Outputs "Lỗi xảy ra"
Nếu không có try/catch sẽ làm crash chương trình vì a[5] không tồn tại, nhưng có try/catch chương trình sẽ chuyển hướng đến khối catch
throw
Từ khóa throw cho phép bạn tự phát sinh ra ngoại lệ để try/catch bắt được.
Ngoài kiểu ngoại lệ Exception còn có các kiểu ngoại lệ khác như: IndexOutOfBoundsException, IllegalArgumentException, ArithmeticException …
Ví dụ bạn phát sinh ngoại lệ ArithmeticException xảy ra trong phương thức của bạn khi tham số bằng 0
int div(int a, int b) throws ArithmeticException { if(b == 0) { throw new ArithmeticException("Lỗi chia cho không"); } else { return a / b; } }
Vậy bạn có thể khai báo phương thức có thể phát sinh ngoại lệ bằng cách viết throw ngay sau tên hàm và danh sách các kiểu ngoại lệ (cách nhau bởi dấu ,). Trong phương thức, trả về ngoại lệ bằng từ khóa throw như ví dụ trên.
Bắt nhiều loại ngoại lệ
Bạn có thể bắt nhiều loại ngoại lệ củ thể khác nhau bằng cách viết nhiều khối catch
Ví dụ
try { //some code } catch (ExceptionType1 e1) { //Catch block } catch (ExceptionType2 e2) { //Catch block } catch (ExceptionType3 e3) { //Catch block }