GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Exception Handling Một số tính năng mới về xử lý ngoại lệ trong Java 7

Một số tính năng mới về xử lý ngoại lệ trong Java 7

Đăng vào 09/12/2017 . Được đăng bởi GP Coder . 5497 Lượt xem . Toàn màn hình

Trong bài viết Xử lý ngoại lệ trong Java, tôi đã giới thiệu với các bạn cách xử lý ngoại lệ với khối lệnh try-catch-finally. Trong bài này, tôi sẽ giới thiệu với các bạn một số tính năng mới về xử lý ngoại lệ được sử dụng từ phiên bản Java 7.

Nội dung

  • 1 Multi-Catch exception
  • 2 Try with resource
  • 3 Sử dụng Multiple Resources
  • 4 Custom AutoClosable

Multi-Catch exception

Trước Java 7, chúng ta có thể catch nhiều Exception bằng cách xử dụng nhiều khối lệnh catch.


package com.gpcoder.exception;

import java.util.List;

public class MultiCatchExample {
	public static void main(String[] args) {
		try {
			List<Integer> list = null;

			Integer num = list.get(1); // NullPointerException, ArrayIndexOutOfBoundsException

			int avg = num / 0; // ArithmeticException

		} catch (NullPointerException ex) {
			System.out.println(ex);
		} catch (ArrayIndexOutOfBoundsException ex) {
			System.out.println(ex);
		} catch (ArithmeticException ex) {
			System.out.println(ex);
		}

		System.out.println("Finished!");
	}
}

[java]

Với Java 7 trở về sau, ta có thể viết gộp các Exception như sau:

[java]

package com.gpcoder.exception;

import java.util.List;

public class MultiCatchJava7Example {
	public static void main(String[] args) {
		try {
			List<Integer> list = null;

			Integer num = list.get(1); // NullPointerException, ArrayIndexOutOfBoundsException

			int avg = num / 0; // ArithmeticException
		} catch (NullPointerException | ArithmeticException | ArrayIndexOutOfBoundsException ex) {
			System.out.println(ex);
		}

		System.out.println("Finished!");
	}
}

Như bạn thấy, với Java 7 cú pháp xử lý ngoại lệ sẽ đơn giản hơn. Chúng ta có thể xử lý nhiều exception trong cùng một cách, trước Java 7 không thể làm được điều này (ngoại trừ gọi cùng hàm con xử lý ngoại lệ).

Try with resource

Resource là một đối tượng cần phải được đóng lại mỗi khi sử dụng nó. Ví dụ: khi ta mở một file, một kết nối CSDL hoặc một socket, sau khi sử dụng xong, ta cần phải đóng lại … Trước Java 7, ta thường đóng resource ở bên trong finally. Tuy nhiên, từ phiên bản Java 7 trở đi, Java đã tự động quản lý công việc này giúp chúng ta. Ta chỉ cần bỏ resource vào bên trong try mà thôi, không cần phải đóng resource ở bên trong finally nữa.

Trong ví dụ dưới đây, tôi sử dụng một thể hiện của BufferedReader để đọc dữ liệu từ tập tin. BufferedReader là một resource phải được đóng sau khi chương trình kết thúc với nó. Trước Java SE 7, bạn có thể sử dụng một khối finally để đảm bảo rằng một resource được đóng lại bất kể câu lệnh try hoàn thành bình thường hay có ngoại lệ xảy ra.


package com.gpcoder.exception;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryResourceExample {

	public static void main(String[] args) throws IOException {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("D:\\gpcoder.txt"));

			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (br != null)
					br.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}
}

Từ phiên bản Java 7 trở đi, chúng ta có thể viết lại như sau:


package com.gpcoder.exception;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryResourceJava7Example {
	public static void main(String[] args) throws IOException {

		try (BufferedReader br = new BufferedReader(new FileReader("D:\\gpcoder.txt"))) {
			
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Trong ví dụ này, tài nguyên đã khai báo trong câu lệnh try-with-resources là một BufferedReader. Khai báo xuất hiện trong ngoặc đơn ngay sau khi thử từ khoá try. Lớp BufferedReader, trong Java SE 7 trở lên, thực hiện giao diện java.lang.AutoCloseable. Bởi vì thể hiện của BufferedReader được khai báo trong câu lệnh try-with-resource, nó sẽ được đóng lại bất kể câu lệnh try hoàn thành bình thường hay có ngoại lệ xảy ra.

Sử dụng Multiple Resources

Bạn có thể sử dụng nhiều Resource bên trong một khối try-with-resources và tất chúng cũng sẽ tự được đóng tự động khi chương trình hoàn thành hay có ngoại lệ xảy ra. Đây là một ví dụ:


package com.gpcoder.exception;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class TryMultiResourceJava7Example {

	public static void main(String[] args) throws FileNotFoundException, IOException {
		try (Reader reader = new FileReader("D:\\gpcoder.txt"); 
				BufferedReader br = new BufferedReader(reader)) {

			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		}
	}
}

Ví dụ này tạo ra hai resource nằm trong dấu ngoặc đơn sau từ try. Một FileReader và một BufferedReader. Cả hai tài nguyên này sẽ được đóng tự động khi thực thi lệnh rời khỏi khối try.

Tài nguyên sẽ được đóng theo thứ tự ngược lại thứ tự mà chúng được tạo ra / liệt kê bên trong dấu ngoặc đơn. Đầu tiên BufferedReader sẽ được đóng lại, sau đó FileReader.

Custom AutoClosable

try-with-resources không chỉ làm việc với các lớp được xây dựng trong Java. Bạn cũng có thể cài đặt interface java.lang.AutoCloseable trong các lớp của mình, và sử dụng chúng với cấu trúc try-with-resources.

Inteface AutoClosable chỉ có một phương thức gọi là close(), nó được khai báo như sau:


package java.io;
import java.io.IOException;

public interface Closeable extends AutoCloseable {

    public void close() throws IOException;
	
}

Bất kỳ lớp cài đặt (implement) giao diện này có thể được sử dụng với cấu trúc try-with-resources. Đây là một ví dụ đơn giản cài đặt Interface này:


package com.gpcoder.exception;

public class CustomAutoClosable implements AutoCloseable {

	public void yourAction() {
		System.out.println("yourAction working ...");
	}

	@Override
	public void close() throws Exception {
		System.out.println("CustomAutoClosable closed!");
	}
}

Phương thức yourAction() không phải là một phần của Inteface AutoClosable. Tôi viết thêm phương thức này để có thể làm được gì đó nhiều hơn thay vì chỉ nhắm mục đích xử lý sự kiện close().

Đây là một ví dụ về cách CustomAutoClosable được sử dụng với cấu trúc try-with-resources:


package com.gpcoder.exception;

public class CustomAutoClosableExample {

	public static void main(String[] args) throws Exception {

		try (CustomAutoClosable closAble = new CustomAutoClosable()) {
			closAble.yourAction();
		}

	}
}

Kết quả thực thi chương trình trên:


yourAction working ...
CustomAutoClosable closed!

Như bạn thấy, try-with-resources là một cách khá mạnh mẽ để đảm bảo rằng các tài nguyên được sử dụng bên trong một khối catch thử được đóng lại một cách chính xác, cho dù những resource này do bạn tự tạo hay các thành phần tích hợp có sẵn của Java.

Tài liệu tham khảo:

  • https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
5.0
12
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Exception Handling Được gắn thẻ: Exception

Xây dựng dự án nhiều Module với Maven
Serialization và Deserialization trong java

Có thể bạn muốn xem:

  • Tránh lỗi NullPointerException trong Java như thế nào? (06/08/2018)
  • Xử lý ngoại lệ đối với trường hợp ghi đè phương thức trong java (07/11/2017)
  • Xử lý ngoại lệ trong Java (Exception Handling) (06/11/2017)
  • Từ khóa throw và throws trong Java (07/11/2017)
  • Tránh lỗi ConcurrentModificationException trong Java như thế nào? (27/08/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98059 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97699 lượt xem)
  • Giới thiệu Design Patterns (87764 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86433 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83839 lượt xem)

Nội dung bài viết

  • 1 Multi-Catch exception
  • 2 Try with resource
  • 3 Sử dụng Multiple Resources
  • 4 Custom AutoClosable

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link