1. Khối try-catch-finally
Khối lệnh try trong java được sử dụng để chứa một đoạn code có thế xảy ra một ngoại lệ. Nó phải được khai báo trong phương thức. Sau một khối lệnh try bạn phải khai báo khối lệnh catch hoặc finally hoặc cả hai. Cú pháp:
try{
//code ma co the nem exception
}catch(Exception_class_Name ref){}
try{
//code ma co the nem exception
}finally{}
Vai trò của từng khối:
- catch: Khối catch trong java được sử dụng để xử lý các Exception. Nó phải được sử dụng sau khối try.
- finally: Khối lệnh finally trong java được sử dụng để thực thi các lệnh quan trọng như đóng kết nối, đóng stream,…Nó luôn được thực thi cho dù có ngoại lệ xảy ra hay không hoặc gặp lệnh return trong khối try.
Nếu bạn phải thực hiện các tác vụ khác nhau mà ở đó có thể xảy ra các ngoại lệ khác nhau, hãy sử dụng đa khối lệnh catch trong java. Ví dụ:
public class TestMultiCatchBlock{
public static void main(String args[]){
try{
int a[]=new int[5];
a[5]=30/0;
}
catch(ArithmeticException e){System.out.println("Task1 duoc hoan thanh");}
catch(ArrayIndexOutOfBoundsException e){System.out.println("Task2 duoc hoan thanh");}
catch(Exception e){System.out.println("Task chung duoc hoan thanh");}
System.out.println("Phan code con lai...");
}
}
Khi sử dụng đa khối lệnh catch, chúng ta cần tuân thủ các nguyên tắc sau:
- Vào một thời điểm chỉ xảy ra một ngoại lệ và tại một thời điểm chỉ có một khối catch được thực thi.
- Tất cả các khối catch phải được sắp xếp từ cụ thể nhất đến chung nhất, tức là phải khai báo khối lệnh catch để xử lý lỗi ArithmeticException trước khi khai báo catch để xử lý lỗi Exception.
Không chỉ vậy, đôi khi một tình huống có thể phát sinh khi một phần của một khối lệnh có thể xảy ra một lỗi và toàn bộ khối lệnh chính nó có thể xảy ra một lỗi khác. Do đó, trong những trường hợp như vậy, trình xử lý ngoại lệ try cũng phải được lồng nhau. Ví dụ:
public class TestException {
public static void main(String args[]) {
try {
try {
System.out.println("Thuc hien phep chia");
int b = 39 / 0;
} catch (ArithmeticException e) {
System.out.println(e);
}
try {
int a[] = new int[5];
a[5] = 4;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
}
System.out.println("khoi lenh khac");
} catch (Exception e) {
System.out.println("xy ly ngoai le");
}
System.out.println("tiep tuc chuong trinh..");
}
}
2. Throw và Throws
Từ khoá throw trong java được sử dụng để ném ra một ngoại lệ cụ thể. Chúng ta có thể ném một trong hai ngoại lệ checked hoặc unchecked trong java bằng từ khóa throw. Từ khóa throw chủ yếu được sử dụng để ném ngoại lệ tùy chỉnh (ngoại lệ do người dùng tự định nghĩa). Cú pháp từ khóa throw:
throw exception;
Ví dụ: Trong ví dụ này, chúng ta đã tạo phương thức validate mà nhận giá trị nguyên như là một tham số. Nếu tuoi là nhỏ hơn 18, chúng ta ném ArithmeticException, nếu không chúng ta sẽ in một thông báo là: Chao mung ban den bo phieu.
public class TestThrow1 {
static void validate(int age) {
if (age < 18)
throw new ArithmeticException("not valid");
else
System.out.println("welcome");
}
public static void main(String args[]) {
validate(13);
System.out.println("rest of the code...");
}
}
Kết quả thu được:
Exception in thread "main" java.lang.ArithmeticException: not valid
Từ khóa throws trong java được sử dụng để khai báo một ngoại lệ. Nó thể hiện thông tin cho lập trình viên rằng có thể xảy ra một ngoại lệ, vì vậy nó là tốt hơn cho các lập trình viên để cung cấp các mã xử lý ngoại lệ để duy trì luồng bình thường của chương trình. Exception Handling chủ yếu được sử dụng để xử lý ngoại lệ checked. Nếu xảy ra bất kỳ ngoại lệ unchecked như NullPointerException, đó là lỗi của lập trình viên mà anh ta không thực hiện kiểm tra trước khi code được sử dụng. Cú pháp:
kieu_tra_ve ten_phuong_thuc() throws ten_lop_exception{
//phan code cua phuong thuc
}
Từ khóa này chỉ chỉ dành cho Checked Exception, bởi vì:
- Unchecked Exception: dưới sự điều khiển của bạn bằng việc kiểm tra và sửa lỗi code.
- Error: Vượt quá tầm kiểm soát của bạn, ví dụ: bạn không thể làm điều gì nếu xuất hiện VirtualMachineError hoặc StackOverflowErrror.
Phân biệt throw và throws trong Java
throw | throws |
---|---|
Từ khóa throw được sử dụng để ném tường minh một exception | Từ khóa throws được sử dụng để khai báo một exception |
Checked Exception không thể được lan truyền chỉ bởi sử dụng throw | Checked Exception không thể được lan truyền với throws |
Throw được theo sau bởi một instance | Throws được theo sau bởi một lớp |
Throw được sử dụng bên trong một phương thức | Throws được sử dụng với khai báo phương thức |
Bạn có thể ném nhiều exception | Bạn có thể khai báo nhiều exception, ví dụ public void phuong_thuc()throws IOException,SQLException |
3. Custom Exception
Custom Exception là ngoại lệ do bạn tự định nghĩa hay bạn tự tạo riêng cho mình. Custom Exception trong Java được sử dụng để tùy biến ngoại lệ theo yêu cầu của người dùng. Bởi sự giúp đỡ của loại ngoại lệ này, bạn có thể có riêng kiểu và thông điệp ngoại lệ cho mình. Ví dụ:
class InvalidAgeException extends Exception{
InvalidAgeException(String s){
super(s);
}
}
class TestCustomException1{
static void validate(int age)throws InvalidAgeException{
if(age<18)
throw new InvalidAgeException("Khong hop le");
else
System.out.println("Chao mung ban toi bo phien");
}
public static void main(String args[]){
try{
validate(13);
}catch(Exception m){System.out.println("Exception xuat hien: "+m);}
System.out.println("Phan code con lai...");
}
}
Kết quả thu được sau khi chạy chương trình là:
Exception xuat hien: InvalidAgeException:Khong hop le
Phan code con lai...
Như vậy, qua bài viết này, chúng ta đã cùng nhau tìm hiểu cách xử lý ngoại lệ trong Java bằng các cách khau nhau. Cảm ơn các bạn đã đọc.