Khối finally
Thuộc phần Logic và luồng chương trình trong hành trình Java của Coddy. Bài học 41 trên 59.
Khối finally chứa code sẽ chạy sau các khối try-catch, dù có xảy ra ngoại lệ hay không. Khối này thường dùng cho các thao tác dọn dẹp như đóng tệp hoặc kết nối cơ sở dữ liệu.
Đây là cấu trúc cơ bản của khối try-catch-finally:
try {
// Đoạn code có thể phát sinh ngoại lệ (exception)
} catch (ExceptionType e) {
// Đoạn code xử lý ngoại lệ
} finally {
// Đoạn code luôn chạy
}Hãy xem một ví dụ với bộ đếm:
int counter = 0;
try {
int result = 10 / 0;
// Lệnh này sẽ gây ra một ngoại lệ (exception)
counter = 1;
} catch (ArithmeticException e) {
counter = 2;
} finally {
counter = 3;
// Lệnh này sẽ luôn chạy
}Sau khi chạy đoạn code trên, counter chứa:
3
Kiểu trong dấu ngoặc đơn của catch quyết định khối lệnh đó xử lý những lỗi nào. Hai lỗi thường gặp là ArithmeticException, xảy ra khi phép chia số nguyên cho 0, và NumberFormatException, xảy ra khi Integer.parseInt() nhận văn bản không phải là số. Một catch có thể xử lý cùng lúc nhiều kiểu:
try {
int value = Integer.parseInt(text);
int result = 10 / value;
} catch (ArithmeticException | NumberFormatException e) {
// Xử lý cả hai ngoại lệ
} finally {
// Luôn chạy
}Thay vào đó, bắt Exception có phạm vi rộng hơn: nó xử lý cả hai lỗi này và mọi ngoại lệ khác.
Thử thách
DễTạo một phương thức có tên processNumber nhận hai đối số:
- Một String (
number) để chuyển thành số nguyên - Một giá trị boolean (
shouldThrow) quyết định có nên ném ngoại lệ hay không
Phương thức này cần:
- Khởi tạo biến result bằng 0
- Trong khối try:
- Nếu shouldThrow là true, chia 10 cho 0
- Nếu không, chuyển chuỗi number thành số nguyên rồi lưu vào result
- Trong khối catch: đặt result thành -1
- Trong khối finally: cộng 100 vào result
- Trả về result dưới dạng chuỗi
Tự làm thử
import java.util.Scanner;
public class Main {
public static String processNumber(String number, boolean shouldThrow) {
// Viết code của bạn ở đây
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String number = scanner.nextLine();
boolean shouldThrow = Boolean.parseBoolean(scanner.nextLine());
System.out.println(processNumber(number, shouldThrow));
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Mảng đa chiều
Kiến thức cơ bản về mảng 2DTruy cập phần tử trong mảng 2DVòng lặp lồng nhau với mảng 2DÔn tập về mảng 2DPhép cộng và phép trừ ma trậnMảng không đềuMảng 3D trở lênCác mẫu thường gặp với mảng 2DÔn tập về mảng2HashMap phần 1
HashMap là gì?Khai báo HashMapTruy cập giá trịKiểm tra khóa có tồn tạiChỉnh sửa từ điểnÔn tập: HashMapTự luyện tập: Trình biên dịch Java online