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

/ 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 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 đư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 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 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 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ố 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 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

/ 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 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: Alternatives in a multi-catch statement cannot be related by subclassing

Trong ví dụ này, ArithmeticExceptionvà ArrayIndexOutOfBoundsExceptionđều là lớp con của Exceptionlớp. Vì vậy, chúng tôi gặp lỗi biên dịch.









Gõ tìm kiếm nhanh...