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 catch

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/
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 bởi vì chúng ta đang cố gắng chia một số cho 0.
  • ArrayIndexOutOfBoundsException bởi vì chúng ta đã 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 ta đang cố gắng gán giá trị cho chỉ mục 10.

Chúng ta đang in ra thông báo ngoại lệ trong cả hai khối catch 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 đó, một ArithmeticException được đưa ra đầu tiên với thông báo / bằng 0.

1. Xử lý nhiều trường hợp ngoại lệ trong một khối catch

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

Mỗi loại ngoại lệ có thể được xử lý bởi khối catch đượ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: Nhiều khối catch

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 khối catch 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 khối catch vì không có mã dự phòng.

Lưu ý: Nếu một khối catch xử lý nhiều ngoại lệ, thì tham số bắt là ngầm định final. Điều này có nghĩa là chúng ta không thể gán bất kỳ giá trị nào để bắt tham số.

2. Bắt Ngoại lệ cơ bản

Khi bắt nhiều ngoại lệ trong một khối catch, 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 khối catch, chúng ta chỉ có thể bắt ngoại lệ cơ bản 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ơ bản

Đầu ra

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());
    }
  }
}

Chúng ta biết rằng tất cả các lớp ngoại lệ đều là lớp con của lớp Exception. Vì vậy, thay vì bắt nhiều ngoại lệ chuyên biệt, chúng ta có thể bắt lớp Exception đơn giản .

/ by zero

lệ đều là lớp con của lớp Exception. Vì vậy, thay vì bắt nhiều ngoại lệ chuyên biệt, chúng ta có thể bắt lớp Exception đơn giản .

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

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!