Menu
CoddyTech

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.

challenge icon

Thử thách

Dễ

Tạo một phương thức có tên processNumber nhận hai đối số:

  1. Một String (number) để chuyển thành số nguyên
  2. 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:

  1. Khởi tạo biến result bằng 0
  2. 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
  3. Trong khối catch: đặt result thành -1
  4. Trong khối finally: cộng 100 vào result
  5. 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));
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Java online