Search code examples
javatry-catchbufferedreader

Use try-with-resources or close this "BufferedReader" in a "finally" clause


Been looking for a way to fix this issue. Read all the previous answers but none helped me out. Could it be any error with SonarQube?

public class Br {

    public String loader(String FilePath){

        BufferedReader br;
        String str = null;
        StringBuilder strb = new StringBuilder();
        try {
            br = new BufferedReader(new FileReader(FilePath));
            while ((str = br.readLine()) != null) {
                strb.append(str).append("\n");
            }
        } catch (FileNotFoundException f){
            System.out.println(FilePath+" does not exist");
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return strb.toString();
    }
}

Solution

  • You are not calling br.close() which means risking a resource leak. In order to reliably close the BufferedReader, you have two options:

    using a finally block:

    public String loader(String FilePath) {
        // initialize the reader with null
        BufferedReader br = null;
        String str = null;
        StringBuilder strb = new StringBuilder();
    
        try {
            // really initialize it inside the try block
            br = new BufferedReader(new FileReader(FilePath));
            while ((str = br.readLine()) != null) {
                strb.append(str).append("\n");
            }
        } catch (FileNotFoundException f) {
            System.out.println(FilePath + " does not exist");
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // this block will be executed in every case, success or caught exception
            if (br != null) {
                // again, a resource is involved, so try-catch another time
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        return strb.toString();
    }
    

    using a try-with-resources statement:

    public String loader(String FilePath) {
        String str = null;
        StringBuilder strb = new StringBuilder();
    
        // the following line means the try block takes care of closing the resource
        try (BufferedReader br = new BufferedReader(new FileReader(FilePath))) {
            while ((str = br.readLine()) != null) {
                strb.append(str).append("\n");
            }
        } catch (FileNotFoundException f) {
            System.out.println(FilePath + " does not exist");
            return null;
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        return strb.toString();
    }