Moh*_*ary 13 java java-7 try-with-resources
我正在阅读有关JDK7中的try-with-resource的内容,当我考虑将我的应用程序升级为使用JDK7运行时,我遇到了这个问题.
当使用BufferedReader时,例如写入抛出IOException和close抛出IOException ..在catch块中我关注写入引发的IOException ..但我不会太在意关闭抛出的那个..
数据库连接和任何其他资源的问题相同..
作为一个例子,我创建了一个自动关闭资源:
public class AutoCloseableExample implements AutoCloseable {
public AutoCloseableExample() throws IOException{
throw new IOException();
}
@Override
public void close() throws IOException {
throw new IOException("An Exception During Close");
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用它时:
public class AutoCloseTest {
public static void main(String[] args) throws Exception {
try (AutoCloseableExample example = new AutoCloseableExample()) {
System.out.println(example);
throw new IOException("An Exception During Read");
} catch (Exception x) {
System.out.println(x.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在不必为BufferedReader等类创建包装器的情况下区分这些异常?
大多数情况下,我将资源关闭在finally块中的try/catch中,而不关心处理它.
Fly*_*ing 12
让我们考虑一下这个课程:
public class Resource implements AutoCloseable {
public Resource() throws Exception {
throw new Exception("Exception from constructor");
}
public void doSomething() throws Exception {
throw new Exception("Exception from method");
}
@Override
public void close() throws Exception {
throw new Exception("Exception from closeable");
}
}
Run Code Online (Sandbox Code Playgroud)
和try-with-resource块:
try(Resource r = new Resource()) {
r.doSomething();
} catch (Exception ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
1.启用所有3个throw语句.
将打印消息"构造函数的异常",构造函数抛出的异常将被禁止,这意味着您无法捕获它.
2.删除了throw in构造函数.
现在,堆栈跟踪将在下面打印"Exception from method"和"Suppressed:Exception from closeable".在这里你也无法捕获close方法抛出的被抑制异常,但是你将被禁止有关被抑制的异常.
3.删除构造函数和方法的抛出.
你可能已经猜到了"可以关闭的例外"将被打印出来.
重要提示:在上述所有情况下,您实际上都会捕获所有异常,无论它们扔到哪里.因此,如果您使用try-with-resource块,则不需要使用另一个try-catch包装块,它根本就没用.
希望能帮助到你 :)
| 归档时间: |
|
| 查看次数: |
4428 次 |
| 最近记录: |