Java初学者书中包含以下代码。本书还很好地解释了异常,并且由于我理解异常是如何工作的,因此我对以下代码提出了疑问。
由于某些原因,如果FileWriter类抛出异常,则不会执行writer.close()
。因此,我认为关闭writer对象的最佳位置是finally块。甚至在此之前我已经看到很多代码都是这样编写的,资源将在try块本身中关闭。我认为没有必要这样做。只有在没有例外的情况下才会关闭资源。
我错了吗?在java中关闭资源的最佳方法是什么?我们是不是应该编写如下代码?
public static void main(String[] args) {
try{
FileWriter writer = new FileWriter("file.txt");
writer.write("i am writing");
writer.close();
}catch(IOException e){
ex.printStackTrace();
}
}
答案 0 :(得分:4)
我同意@ cyber-rookie,最好关闭finally块中的资源。
Java 7引入了“try-with-resources”以减少编程错误......
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
你现在可以写......
try (FileWriter writer = new FileWriter("file.txt")) {
writer.write("i am writing");
} catch (IOException e) {
e.printStackTrace();
}
编译器将添加额外的代码以关闭块末尾的编写器
答案 1 :(得分:2)
如果您使用的是Java 7,最好的方法是使用try with resource。见https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (FileWriter writer = new FileWriter("file.txt")) {
writer.write("i am writing");
}
答案 2 :(得分:1)
你是对的,资源应该在finally
块中关闭。
从java 7
开始,您可以将try-with-resource用作:
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
因为BufferedReader
实例是在try-with-resource
语句中声明的,所以如果try
语句完成normally or abruptly
,如果这些资源实现AutoCloseable
,它将被关闭} interface。
答案 3 :(得分:1)
根据我的经验,我们将使用try-catch的finally
子句:
public static void main(String[] args) {
FileWriter writer = null;
try {
writer = new FileWriter("file.txt");
writer.write("i am writing");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (writer != null)
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
PS:将它放在单独的方法中并抛出异常,让类使用此句柄异常。
答案 4 :(得分:1)
回答评论,在资源块的尝试中添加多个资源:
try(FileWriter writer = new FileWriter("file.txt"); BufferedReader reader = new BufferedReader(new FileReader("file.txt"))){
// you can put many AUTOCLOSEABLE objects in try with resource. Just seperate them with ";"
} catch (IOException e) {
e.printStackTrace();
}
答案 5 :(得分:1)
在工作中(Java 6),我们关闭TRY块中的资源,然后在FINALLY块中进行防御性关闭。
BufferedReader bufferedReader;
try {
//initialize and do something with the bufferedReader
bufferedReader.close();
} catch (FileNotFoundException ex) {
// notify the user
} catch (IOException ex) {
// notify the user
} finally {
if (bufferedReader != null) {
try {
//defensive close
bufferedReader.close();
} catch (IOException ex) {
// this will be thrown if bufferedReader is already closed (in Try block, so can be leave to blank
}
}
}