尝试用资源或关闭()进退两难

时间:2013-07-28 08:31:01

标签: java exception-handling

我有一个可以抛出IOException的函数,所以我没有在内部捕获异常。但是我有一些资源要关闭。使用try-with-resource(没有任何catch块)以这种方式做是正确的:

public void workOnFiles() throws IOException {

    try(FileInputStream fis = new FileInputStream("bau.txt");) {
        // Do some stuff
    }       
}

或者我应该这样做:

public void workOnFiles() throws IOException {

    FileInputStream fis = new FileInputStream("bau.txt");
    // Do some stuff
    fis.close();    
}

3 个答案:

答案 0 :(得分:5)

在第二项中,如果抛出异常,您的fis将不会被关闭。一个选项是附加可以在try块中抛出异常的语句,并关闭fis块中的finally

但是,由于您已经在 Java 7 ,因此您应该使用try-with-resource

答案 1 :(得分:0)

try-with-resources总是关闭(Closeable resources)资源,无论异常是否引发(Work only java7 onwards)

如果异常加剧,您的第二个代码不会关闭资源 因此,如果您使用try-with-resources,则可以使用java7,或者使用tryfinally块修改代码。

finally block guarantees execution irrespective of exception raises or not

答案 2 :(得分:0)

如果您热衷于使用第二种方法,请关闭finally块中的资源。

public void workOnFiles() throws IOException {
   FileInputStream fis = null;
   try {
     fis = new FileInputStream("bau.txt");
   // Do some stuff
   }
   finally  {
     try {
      fis.close(); 
     }
     catch(Exception e) {
      //logger.error(e);
      // e.printStackTrace();
     }   
}