Khối Lệnh try Lồng Nhau (Nested Try Block)
Khối lệnh try lồng nhau là một cấu trúc trong Java cho phép bạn bao bọc một khối lệnh try bên trong một khối try khác. Điều này rất hữu ích khi bạn muốn xử lý nhiều lớp ngoại lệ khác nhau hoặc khi một phần của mã có thể ném ra nhiều loại ngoại lệ.
Cú pháp của khối lệnh try lồng nhau:
Cú pháp
try {
// Khối lệnh có thể ném ngoại lệ thứ nhất
try {
// Khối lệnh có thể ném ngoại lệ thứ hai
} catch (ExceptionType2 e2) {
// Xử lý ngoại lệ thứ hai
}
} catch (ExceptionType1 e1) {
// Xử lý ngoại lệ thứ nhất
}
Tại sao sử dụng khối try lồng nhau?
khi một đoạn mã có thể gây ra nhiều loại lỗi khác nhau, bạn có thể sử dụng các khối try lồng nhau để xử lý từng loại lỗi một cách riêng biệt. Điều này giúp bạn kiểm soát tốt hơn các tình huống lỗi và đảm bảo chương trình hoạt động ổn định.
Chúng ta hãy xem một ví dụ trong đó chúng ta đặt một khối try trong một khối try khác cho hai ngoại lệ khác nhau.
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
try {
// Khối try bên ngoài
try {
// Khối try bên trong
int data = 50 / 0; // Gây ra ArithmeticException
} catch (ArithmeticException e) {
System.out.println("Ngoại lệ trong khối try bên trong: " + e);
}
// Mã tiếp theo sau khối try-catch bên trong
int[] arr = new int[5];
arr[5] = 10; // Gây ra ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Ngoại lệ trong khối try bên ngoài: " + e);
}
System.out.println("Phần còn lại của mã");
}
}
Kết quả của chương trình là:
Ngoại lệ trong khối try bên ngoài: java.lang.ArrayIndexOutOfBoundsException:
Index 5 out of bounds for length 5
Phần còn lại của mã
Trong trường hợp các khối try lồng nhau, khối try bên trong sẽ được thực thi trước. Điều này là do chương trình thực hiện theo thứ tự từ trong ra ngoài.
Dưới đây là một ví dụ về khối try lồng nhau trong Java để minh họa cách xử lý ngoại lệ ở nhiều cấp độ khác nhau:
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
// Khối try bên ngoài
try {
System.out.println("Bắt đầu khối try bên ngoài");
// Khối try bên trong
try {
System.out.println("Bắt đầu khối try bên trong");
// Khối try bên trong nhất
try {
System.out.println("Bắt đầu khối try bên trong nhất");
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // Gây ra ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Ngoại lệ trong khối try bên trong nhất: " + e);
}
int data = 50 / 0; // Gây ra ArithmeticException
} catch (ArithmeticException e) {
System.out.println("Ngoại lệ trong khối try bên trong: " + e);
}
String str = null;
System.out.println(str.length()); // Gây ra NullPointerException
} catch (NullPointerException e) {
System.out.println("Ngoại lệ trong khối try bên ngoài: " + e);
}
System.out.println("Phần còn lại của mã");
}
}
Kết quả của chương trình là:
Bắt đầu khối try bên trong
Bắt đầu khối try bên trong nhất
Ngoại lệ trong khối try bên trong nhất: java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
Ngoại lệ trong khối try bên trong: java.lang.ArithmeticException: / by zero
Ngoại lệ trong khối try bên ngoài: java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
Phần còn lại của mã
Giải thích:
↳ Khối try bên trong sẽ được thực thi trước.
↳ Khi một ngoại lệ xảy ra, nó sẽ được bắt bởi khối catch gần nhất có thể xử lý ngoại lệ đó.
↳ Chương trình tiếp tục thực thi các khối try bên ngoài sau khi xử lý ngoại lệ trong các khối try bên trong.