Java 发生异常后,如何关闭BufferedReader?

Java 发生异常后,如何关闭BufferedReader?,java,exception,Java,Exception,以一个简单的代码为例: FileInputStream fis = null; BufferedReader dr = null; try{ fis = new FileInputStream("D:\\acc_cp.log"); dr = new BufferedReader(new InputStreamReader(fis));

以一个简单的代码为例:

            FileInputStream fis = null;
            BufferedReader dr = null;
            try{
                fis = new FileInputStream("D:\\acc_cp.log");
                dr = new BufferedReader(new InputStreamReader(fis));
                producer = new LogProducer(); // it may throw an exception
                String line = "";
                while((line = dr.readLine())!= null ){ // readline may throw an exception too
                     producer.send("test", line);
                     Thread.sleep(50);
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                if(producer != null){
                    producer.close(); 
                }
            }
两个
producer=新的LogProducer()
(line=dr.readLine())
可能引发异常。所以,我的问题是,如果
producer=newlogproducer()抛出异常,我想正确关闭BufferedReader,合适的方法是什么?

如果我将
dr.close()
放在catch子句或finally子句中,它会迫使我再次抛出异常,显然这不是一个好的解决方案。

您可以用与当前关闭
生产者
(在
finally
块中)相同的方法来执行此操作(如果您不想重新抛出
IOException
,请添加一个try catch)像

或者,您可以使用

} finally {
    if(producer != null){
        producer.close(); 
    }
    if(dr != null) {
        try {
            dr.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
try (FileInputStream fis = new FileInputStream("D:\\acc_cp.log");
    BufferedReader dr = new BufferedReader(new InputStreamReader(fis));
    LogProducer producer = new LogProducer()) {
    // ...

如果您使用的是Java 6或更早版本,请使用确保您正在关闭要添加到@MadProgrammer注释中的任何已打开的资源,然后在
finally
部分使用静默
try catch
关闭您的资源。
BufferedReader#close
抛出
IOException
,因此,OP关注的是如何在
中处理此异常。