CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnJava 7: Cách bắt nhiều ngoại lệ trong cùng một catch block
Java

Java 7: Cách bắt nhiều ngoại lệ trong cùng một catch block

CyStack blog 2 phút để đọc
CyStack blog30/08/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 2 minutes

Trong Java 7, catch block đã được cải tiến để xử lý nhiều exception trong một catch block duy nhất. Nếu bạn đang bắt nhiều exception và chúng có đoạn code xử lý tương tự nhau, thì việc sử dụng tính năng này sẽ giúp giảm trùng lặp code.

Bắt nhiều ngoại lệ trong Java 7

Hãy cùng tìm hiểu tính năng bắt nhiều ngoại lệ trong Java 7 qua một ví dụ.

Bắt nhiều ngoại lệ trong Java 7

Trước Java 7, chúng ta thường bắt nhiều ngoại lệ một cách tuần tự như minh họa bên dưới.

catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Trong Java 7, chúng ta có thể bắt cả hai ngoại lệ này chỉ trong một catch block duy nhất như sau:

catch(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Nếu một catch block xử lý nhiều exception, bạn có thể tách chúng bằng ký hiệu pipe (|). Trong trường hợp này, tham số exception (ex) là final, nên bạn không thể thay đổi nó. Byte code (mã byte) được tạo ra bởi tính năng này nhỏ hơn và giúp giảm sự dư thừa của code.

Java rethrow exception

Một cải tiến khác nằm ở việc compiler (trình biên dịch) phân tích các ngoại lệ được ném lại (rethrown exceptions). Java rethrow exception cho phép bạn chỉ định các loại ngoại lệ cụ thể hơn trong throws clause của khai báo phương thức. Hãy xem một ví dụ nhỏ sau:

package com.journaldev.util;

public class Java7MultipleExceptions {

	public static void main(String[] args) {
		try{
			rethrow("abc");
		}catch(FirstException | SecondException | ThirdException e){
			//below assignment will throw compile time exception since e is final
			//e = new Exception();
			System.out.println(e.getMessage());
		}
	}

	static void rethrow(String s) throws FirstException, SecondException,
			ThirdException {
		try {
			if (s.equals("First"))
				throw new FirstException("First");
			else if (s.equals("Second"))
				throw new SecondException("Second");
			else
				throw new ThirdException("Third");
		} catch (Exception e) {
			//below assignment disables the improved rethrow exception type checking feature of Java 7
			// e=new ThirdException();
			throw e;
		}
	}

	static class FirstException extends Exception {

		public FirstException(String msg) {
			super(msg);
		}
	}

	static class SecondException extends Exception {

		public SecondException(String msg) {
			super(msg);
		}
	}

	static class ThirdException extends Exception {

		public ThirdException(String msg) {
			super(msg);
		}
	}

}

Như bạn thấy, trong phương thức rethrow, catch block đang bắt Exception nhưng nó không xuất hiện trong throws clause. Java 7 compiler sẽ phân tích toàn bộ try block để kiểm tra những loại ngoại lệ nào được ném và sau đó bị ném lại từ catch block.

Lưu ý rằng quá trình phân tích này sẽ bị vô hiệu nếu bạn thay đổi đối số của catch block.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất