处理一个finally块

Mar*_*ius 3 java exception-handling try-finally

我有一些代码创建了一个JarFile和一个URLClassLoader,我想在最后关闭它们.当然,我决定使用该finally块来处理清理:

JarFile jar = ...;
URLClassLoader loader = ...;
try {
    // work ...
} finally {
    jar.close();
    loader.close();
}
Run Code Online (Sandbox Code Playgroud)

但是,两个close()调用都可以抛出异常,因此如果jar.close()抛出异常,则loader.close()无法访问.我想解决这个问题的一种方法是jar.close()使用try-catch块进行处理:

JarFile jar = ...;
URLClassLoader loader = ...;
try {
    // work ...
} finally {
    try {
        jar.close();
    } catch(IOException e) {
    } 
    loader.close();
}
Run Code Online (Sandbox Code Playgroud)

但这看起来很丑陋而且过分.是否有一种优雅的方法来处理finally块中与清理相关的异常?

Pat*_* II 6

在Java 7及更高版本中,尝试使用处理Closeable对象的资源.

这样重新格式化你的代码,

try(JarFile jar = ....; URLClassLoader loader = ....;) 
{
    // work ...
}
Run Code Online (Sandbox Code Playgroud)

只有实现该Closeable接口的类才能以这种方式工作,这两个类都符合这个标准.