下面是我在网上找到的一个Java示例:
try{
//use buffering
InputStream file = new FileInputStream("quarks.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
try{
//deserialize the List
List<String> recoveredQuarks = (List<String>)input.readObject();
//display its data
for(String quark: recoveredQuarks){
System.out.println("Recovered Quark: " + quark);
}
}
finally{
input.close();
}
} catch(ClassNotFoundException ex){
//some exception handling
}在上面的例子中,在关闭输入之前,使用try-finally块对输入执行一些处理有什么好处?换句话说,上面的代码比下面的代码有什么好处:
try{
//use buffering
InputStream file = new FileInputStream("quarks.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
List<String> recoveredQuarks = (List<String>)input.readObject();
for(String quark: recoveredQuarks){
System.out.println("Recovered Quark: " + quark);
}
input.close();
} catch(ClassNotFoundException ex){
//some exception handling
}发布于 2015-09-22 21:30:52
有一个很大的不同:想象一下下面的情况
InputStream file = new FileInputStream("quarks.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
try{
//do sth
throw new RuntimeException();
//do sth else
}
finally{
input.close();
}在这种情况下,使用finally块会抛出异常,但会执行finally块,因此会关闭您的输入。
如果你的代码是
InputStream file = new FileInputStream("quarks.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
//do sth
throw new RuntimeException();
//do sth else
input.close();您的InputStream将无法正常关闭。
但从Java7开始,最优雅的版本将是使用try-with-resources,正如在对您的问题的评论中所提到的:
try (InputStream file = new FileInputStream ("quarks.ser");
InputStream buffer = new BufferedInputStream (file);
ObjectInput input = new ObjectInputStream (buffer);) {
//do sth
throw new RuntimeException ();
//do sth else
}发布于 2015-09-22 21:40:48
使用try / finally的好处是...或者更好的是尝试资源,是它在很大程度上防止了这样的资源泄漏:
诸若此类。一般来说,这些问题的发生是因为代码中有一些路径没有关闭流/套接字/任何东西。如果该路径被采用得太频繁,则尝试打开新的流等都会失败,因为应用程序已经使用了它可用的所有文件描述符。如果正确使用finally,就可以确保在所有重要的情况下都会发布描述符。
还应该注意的是,你在网上找到的例子是不正确的。至少在理论上是这样。如果BufferedInputStream或ObjectInputStream的构造函数抛出异常,那么finally块将不会被执行,并且FileInputStream将被泄漏。
一种更好的编写方法是:
try (InputStream file = new FileInputStream("quarks.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInputStream input = new ObjectInputStream (buffer)) {
// do stuff
} catch (ClassNotFoundException ex){
// handling exception
}https://stackoverflow.com/questions/32718129
复制相似问题