Bài 26: Ý nghĩa của từ khóa finally và throw
1. Khối finally
Khi khối finally có trong đặc tả khối try-catch thì nó được đảm bảo phải thực hiện đến cùng bất luận trong khối try thực hiện như thế nào.
Ví dụ:
public class Bai26
{
public static void main(String[] args){
try{
int x=5;
int y=0;
int z=x/y;
System.out.println("Gia tri cua z la: "+z);
} catch(Exception ex){
System.out.println("Loi: "+ex.getMessage());
} finally {
System.out.println("Thoat chuong trinh!");
}
}
}
Ví dụ trên chỉ ra cách xử lý ngoại lệ xuất hiện ở try thông qua khối catch. Sau đó khối finally sẽ phải được thực hiện.
Lưu ý: Khi không sử dụng khối catch để xử lý các ngoại lệ thì finally vẫn phải được thực hiện nhưng sau đó các phần còn lại của chương trình sẽ không được thực hiện xuất hiện những ngoại lệ tệ hại hơn.
2. Câu lệnh throw
Để tạm thời bỏ qua ngoại lệ chúng ta có thể sử dụng câu lệnh throw. Câu lệnh này có dạng như sau: throw <Biểu thức tham chiếu đối tượng ngoại lệ>
<Biểu thức tham chiếu đối tượng ngoại lệ> là biểu thức xác định một đối tượng của lớp Throwable hoặc của một trong các lớp con của nó. Thông thường một đối tượng ngoại lệ sẽ được tạo ra trong câu lệnh throw để sau đó chúng sẽ được tóm lại và xử lý ở khối catch. Ví dụ câu lệnh
throw new LoiChiaCho0("/ by zero");
Trong đó lớp LoiChiaCho0 là lớp con của Exception có thể định nghĩa đơn giản như sau:
class LoiChiaCho0 extends Exception {
// Ham khoi tao
public LoiChiaCho0(String msg){
super(msg);
}
}
Khi một ngoại lệ xuất hiện và được cho qua thì sự thực hiện bình thường của chương trình sẽ bị treo lại để đi tìm khối catch tương ứng và xử lý ngoại lệ đó. Sau đó khối finally được thực hiện nếu có. Nếu không tìm thấy bộ xử lý ngoại lệ tương ứng trong chương trình thì ngoại lệ đó được xử lý theo cơ chế xử lý ngoại lệ mặc định của hệ thống.
class LoiChiaCho0 extends Exception {
// Ham khoi tao
public LoiChiaCho0(String msg){
super(msg);
}
}
public class Bai26
{
public static void main(String[] args){
int x=5;
int y=0;
try{
if(y==0){
throw new LoiChiaCho0("/ by 0");
}
int z=x/y;
System.out.println("Gia tri cua z la: "+z);
} catch(Exception ex){
System.out.println("Loi: "+ex.getMessage());
} finally {
System.out.println("Thoat chuong trinh!");
}
}
}
Trong ví dụ trên, khối try tạm thời cho qua ngoại lệ xuất hiện ở nhánh if. Lưu ý là phần còn lại của khối try sẽ không được thực hiện. Khối finally được thực hiện, sau đó tiếp tục thực hiện chương trình nếu còn lệnh.
3. Mệnh đề throws
Khi thiết kế các hàm thành phần, chúng ta có thể sử dụng mệnh đề throws để tạm thời cho qua ngoại lệ mà thực hiện một số việc cần thiết khác. Những hàm này lại được sử dụng theo cấu trúc try-catch-finally sau đó để xử lý các ngoại lệ khi chúng xuất hiện như trên. Chương trình dịch có thể cho qua những lỗi ngoại lệ đã phát hiện nếu trong định nghĩa các hàm có sử dụng kết hợp mới mệnh đề throws