java - 发生异常后如何关闭 BufferedReader?

标签 java exception

以简单代码为例:

            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 = new LogProducer();(line = dr.readLine())可能会抛出异常。所以,我的问题是,如果 producer = new LogProducer();抛出异常,我想正确关闭 BufferedReader,合适的方法是什么? 如果我输入 dr.close()在catch子句或finally子句中,它迫使我再次抛出异常,显然这不是一个好的解决方案。

最佳答案

您可以按照当前关闭生产者(在finally block 中)的方式执行此操作(如果您不想重新启动,则添加一个try-catch -抛出IOException)就像

} finally {
    if(producer != null){
        producer.close(); 
    }
    if(dr != null) {
        try {
            dr.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

或者,您可以使用try-with-resources statement 关闭就像

try (FileInputStream fis = new FileInputStream("D:\\acc_cp.log");
    BufferedReader dr = new BufferedReader(new InputStreamReader(fis));
    LogProducer producer = new LogProducer()) {
    // ...

关于java - 发生异常后如何关闭 BufferedReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292915/

相关文章:

java - 如何在Java中以sudo权限执行bash命令?

java - 如何从父类(super class)为查看器注册选择提供程序

java - Apache 公共(public) I/O。如何通过通配符过滤文件?

java - 为什么我不断收到 NetworkOnMainThreadException?

c++ - 浮点 NaN 取决于 C++ 中不相关的异常处理

java - 通过 Arraylist 进行查询

java - 如何将 DateTime 保存为包含时区偏移量的日期?

c# - 程序在启动后几乎立即崩溃

android - 无法解决 android.view.ViewRoot$CalledFromWrongThreadException。需要帮助?

javascript - 尝试扩展 Angular 2ExceptionHandler 类时没有提供程序异常