Java bắt nhiều ngoại lệ

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 catchkhố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 catchkhối duy nhất .

Mỗi loại ngoại lệ có thể được xử lý bởi catchkhố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 catchkhố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 catchkhối vì không có mã dự phòng.

Lưu ý: Nếu một catchkhố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 catchkhố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 catchkhố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 Exceptionlớp. Vì vậy, thay vì bắt nhiều ngoại lệ chuyên biệt, chúng ta có thể bắt Exceptionlớp đơn giản .

Nếu lớp ngoại lệ cơ sở đã được chỉ định trong catchkhối, không sử dụng các lớp ngoại lệ con trong cùng một catchkhố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, ArithmeticExceptionArrayIndexOutOfBoundsExceptionđều là lớp con của Exceptionlớp. Vì vậy, chúng tôi nhận được một lỗi biên dịch.

thú vị bài viết...