Trong hướng dẫn này, chúng ta sẽ học cách xử lý nhiều ngoại lệ trong Java với sự trợ giúp của các ví dụ.
Trước Java 7, chúng ta phải viết nhiều mã xử lý ngoại lệ cho các loại ngoại lệ khác nhau ngay cả khi có dư thừa mã.
Hãy lấy một ví dụ.
Ví dụ 1: Nhiều khối bắt
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Đầu ra
/ by zero
Trong ví dụ này, có thể xảy ra hai trường hợp ngoại lệ:
ArithmeticException
because we are trying to divide a number by 0.ArrayIndexOutOfBoundsException
because we have declared a new integer array with array bounds 0 to 9 and we are trying to assign a value to index 10.
Chúng tôi đang in ra thông báo ngoại lệ trong cả hai catch
khối, tức là mã trùng lặp.
Tính liên kết của toán tử gán =
là từ phải sang trái, do đó, an ArithmeticException
được đưa ra đầu tiên với thông báo/ bằng 0.
Xử lý nhiều trường hợp ngoại lệ trong một khối bắt
Trong Java SE 7 trở lên, giờ đây chúng ta có thể bắt gặp nhiều loại ngoại lệ trong một catch
khối duy nhất .
Mỗi loại ngoại lệ có thể được xử lý bởi catch
khối được phân tách bằng thanh dọc hoặc đường ống |
.
Cú pháp của nó là:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Ví dụ 2: Khối đa bắt
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Đầu ra
/ by zero
Việc nắm bắt nhiều ngoại lệ trong một catch
khối duy nhất giúp giảm sự trùng lặp mã và tăng hiệu quả.
Mã bytecode được tạo ra trong khi biên dịch chương trình này sẽ nhỏ hơn chương trình có nhiều catch
khối vì không có mã dự phòng.
Lưu ý: Nếu một catch
khối xử lý nhiều ngoại lệ, thì tham số bắt là hoàn toàn final
. Điều này có nghĩa là chúng tôi không thể gán bất kỳ giá trị nào để bắt tham số.
Bắt cơ sở Ngoại lệ
Khi bắt nhiều ngoại lệ trong một catch
khối duy nhất , quy tắc được tổng quát hóa thành chuyên biệt.
Điều này có nghĩa là nếu có một hệ thống phân cấp các ngoại lệ trong catch
khối, chúng ta chỉ có thể bắt ngoại lệ cơ sở thay vì bắt nhiều ngoại lệ chuyên biệt.
Hãy lấy một ví dụ.
Ví dụ 3: Chỉ bắt lớp ngoại lệ cơ sở
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Đầu ra
/ by zero
Chúng ta biết rằng tất cả các lớp ngoại lệ đều là lớp con của Exception
lớp. Vì vậy, thay vì bắt nhiều ngoại lệ chuyên biệt, chúng ta có thể bắt Exception
lớp đơn giản .
Nếu lớp ngoại lệ cơ sở đã được chỉ định trong catch
khối, không sử dụng các lớp ngoại lệ con trong cùng một catch
khối. Nếu không, chúng tôi sẽ gặp lỗi biên dịch.
Hãy lấy một ví dụ.
Ví dụ 4: Bắt các lớp ngoại lệ cơ sở và con
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Đầu ra
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
Trong ví dụ này, ArithmeticException
và ArrayIndexOutOfBoundsException
đều là lớp con của Exception
lớp. Vì vậy, chúng tôi gặp lỗi biên dịch.