Java7 异常处理:try-with-resources Finally 块

还可以在 Java try-with-resources 块中添加 finally 块。它的行为与标准的 finally 代码块无异,这意味着它将作为退出 try-with-resources 代码块前的最后一步被执行,即在任何 catch 代码块被执行后。

如果在 try-with-resources 结构的 finally 代码块中抛出异常,所有之前抛出的异常都将丢失。例如:

package com.hxstrive.jdk7.try_with_resources;

import java.util.Arrays;

/**
 * JDK7 新特性 try-with-resources
 * @author hxstrive.com
 */
public class TryWithResourcesDemo11 {

    static class MyResource implements AutoCloseable {
        @Override
        public void close() throws Exception {
            throw new Exception("MyResource.close error");
        }

        public void doSomething(String message) {
            System.out.println("doSomething() message=" + message.toUpperCase());
        }
    }

    public static void main(String[] args) {
        try (MyResource resource = new MyResource()) {
            resource.doSomething("hello");
        } catch (Exception e) {
            System.out.println(Arrays.toString(e.getSuppressed()));
            throw new RuntimeException(e);
        } finally {
            throw new RuntimeException("finally");
        }
        //结果:
        //doSomething() message=HELLO
        //[]
        //Exception in thread "main" java.lang.RuntimeException: finally
    }

}

请注意,从 catch 代码块中抛出的异常将被忽略,因为从 finally 代码块中抛出了新的异常。如果没有 catch 代码块,情况也是如此。那么从 try 代码块内部抛出的任何异常都会丢失,因为从 finally 代码块内部抛出了新的异常。之前的任何异常都不会被抑制,因此在 finally 代码块抛出的异常中也不会出现这些异常。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号