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
/ bằng 0
Trong ví dụ này, có thể xảy ra hai trường hợp ngoại lệ:
ArithmeticException
bởi vì chúng tôi đang cố gắng chia một số cho 0.ArrayIndexOutOfBoundsException
bởi vì chúng tôi đã khai báo một mảng số nguyên mới với giới hạn mảng từ 0 đến 9 và chúng tôi đang cố gắng gán giá trị cho chỉ số 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 ném trước cùng với thông báo / bằng không.
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 cách sử dụng một 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
/ bằng 0
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ố catch là ngầm định 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
/ bằng 0
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: Các lựa chọn thay thế trong một câu lệnh multi-catch không thể được liên kết với nhau theo lớp con
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 nhận được một lỗi biên dịch.