为什么当我尝试关闭 finally 块中的缓冲阅读器时,日食会抱怨



这是我的代码:

public static String readFile()
    {
        BufferedReader br = null;
        String line;
        String dump="";
        try
        {
            br = new BufferedReader(new FileReader("dbDumpTest.txt"));
        }
        catch (FileNotFoundException fnfex)
        {
            System.out.println(fnfex.getMessage());
            System.exit(0);
        }
        try
        {
            while( (line = br.readLine()) != null)
            {
                dump += line + "rn";
            }
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage() + " Error reading file");
        }
        finally
        {
            br.close();
        }
        return dump;

所以 eclipse 抱怨由br.close();引起的未经处理的 IO 异常

为什么这会导致 IO 异常?

我的第二个问题是为什么 eclipse 不抱怨以下代码:

InputStream is = null; 
      InputStreamReader isr = null;
      BufferedReader br = null;
      try{
         // open input stream test.txt for reading purpose.
         is = new FileInputStream("c:/test.txt");
         // create new input stream reader
         isr = new InputStreamReader(is);
         // create new buffered reader
         br = new BufferedReader(isr);
         // releases any system resources associated with reader
         br.close();
         // creates error
         br.read();
      }catch(IOException e){
         // IO error
         System.out.println("The buffered reader is closed");
      }finally{
         // releases any system resources associated
         if(is!=null)
            is.close();
         if(isr!=null)
            isr.close();
         if(br!=null)
            br.close();
      }
   }
}

如果可能的话,如果您以外行的术语保留解释,我将不胜感激。提前感谢您的帮助

这两个代码示例都应该有编译器错误,抱怨未处理的 IOException。 Eclipse 在两个代码示例中都将它们显示为错误。

原因是 close 方法在 finally 块(位于try块之外)中调用时会引发一个 IOException ,一个检查异常。

解决方法是使用 try-with-resources 语句,该语句在 Java 1.7+ 中可用。 声明的资源是隐式关闭的。

try (BufferedReader br = new BufferedReader(new FileReader("dbDumpTest.txt")))
{
   // Your br processing code here
}
catch (IOException e)
{
   // Your handling code here
}
// no finally necessary.

在 Java 1.7 之前,您需要将close()调用包装在 finally 块内它们自己的 try-catch 块中。 这是很多冗长的代码,以确保所有内容都已关闭和清理。

finally
{
    try{ if (is != null) is.close(); } catch (IOException ignored) {}
    try{ if (isr != null) isr.close(); } catch (IOException ignored) {}
    try{ if (br != null) br.close(); } catch (IOException ignored) {}
}

相关内容

  • 没有找到相关文章

最新更新