是否接受了try块中的资源?

时间:2015-04-15 12:38:43

标签: java exception io

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();
       }

    }

6 个答案:

答案 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

        }
    }
}