Bài 1: Giới thiệu về Exception Handling trong Java
1. Tổng Quan về Exception Handling
Exception handling (xử lý ngoại lệ) là một trong những khía cạnh quan trọng trong lập trình Java, giúp chương trình có thể xử lý các tình huống bất ngờ hoặc các lỗi xảy ra trong quá trình thực thi mà không làm chương trình bị dừng đột ngột. Điều này giúp cho ứng dụng trở nên ổn định và dễ bảo trì hơn.
2. Định Nghĩa Ngoại Lệ (Exception)
Ngoại lệ (Exception): Là các tình huống bất thường hoặc lỗi xảy ra trong quá trình thực thi chương trình, chẳng hạn như chia cho số 0, truy cập mảng ngoài chỉ số, hoặc không tìm thấy file.
Lỗi (Error): Là các sự cố nghiêm trọng mà thường chương trình không thể xử lý, chẳng hạn như thiếu bộ nhớ (OutOfMemoryError).
3. Sự Khác Biệt giữa Lỗi (Error) và Ngoại Lệ (Exception)
Lỗi (Error): Thường là các vấn đề liên quan đến môi trường thời gian chạy (runtime environment) mà ứng dụng không thể khắc phục, ví dụ như lỗi hệ thống hoặc thiếu tài nguyên.
Ngoại lệ (Exception): Là các vấn đề liên quan đến logic của ứng dụng và có thể được xử lý bởi mã nguồn của ứng dụng.
4. Phân Loại Ngoại Lệ: Checked và Unchecked Exceptions
Checked Exceptions: Là các ngoại lệ mà trình biên dịch yêu cầu phải được xử lý (ví dụ: IOException, SQLException). Chúng thường đại diện cho các vấn đề ngoại vi như lỗi IO hoặc lỗi cơ sở dữ liệu.
public void readFile(String filePath) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); }Unchecked Exceptions: Là các ngoại lệ không bắt buộc phải được xử lý bởi trình biên dịch (ví dụ: NullPointerException, ArrayIndexOutOfBoundsException). Chúng thường do lỗi logic trong mã nguồn.
public void printArray(int[] arr) { for (int i = 0; i <= arr.length; i++) { // Sẽ gây ra ArrayIndexOutOfBoundsException System.out.println(arr[i]); } }
5. Cấu Trúc Cơ Bản của try-catch-finally
try: Khối mã được giám sát và có thể gây ra ngoại lệ.
catch: Khối mã để xử lý ngoại lệ nếu có xảy ra.
finally: Khối mã được thực thi sau try và catch, bất kể ngoại lệ có xảy ra hay không. Thường được sử dụng để giải phóng tài nguyên.
Ví dụ:
public class ExceptionHandlingExample {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[10]); // Gây ra ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} finally {
System.out.println("This will always be executed.");
}
}
}
6. Ví Dụ Thực Tế
Ví dụ 1: Đọc file và xử lý IOException
public void readFile(String filePath) { try { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.err.println("An IOException occurred: " + e.getMessage()); } finally { System.out.println("Done reading file."); } }Ví dụ 2: Xử lý nhiều loại ngoại lệ
public void processFile(String filePath) { try { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { int num = Integer.parseInt(line); // Có thể gây ra NumberFormatException System.out.println(num); } } catch (FileNotFoundException e) { System.err.println("File not found: " + e.getMessage()); } catch (IOException e) { System.err.println("An IOException occurred: " + e.getMessage()); } catch (NumberFormatException e) { System.err.println("Number format exception: " + e.getMessage()); } finally { System.out.println("Finished processing file."); } }
Kết Luận
Bài viết này đã cung cấp một cái nhìn tổng quan về xử lý ngoại lệ trong Java, bao gồm các khái niệm cơ bản, phân loại ngoại lệ, và cấu trúc try-catch-finally. Trong các bài viết tiếp theo, chúng ta sẽ đi sâu hơn vào từng khía cạnh và thực hành các ví dụ phức tạp hơn để nắm vững kỹ năng xử lý ngoại lệ.