Having problems with "try with resources"

11,274

Solution 1

Firstly declare input and inputBuffer before try{}catch(){}

like this

FileReader input = null;
BufferedReader  inputBuffer = null;
try
{
 ------
 -------


}

in your first block in the finally : Check below two conditions

if(inputBuffer != null)
{
    inputBuffer.close();
}
if(input != null)
{
      input.close();
}

Second : if you want more than one resources in the try do this:

try ( OpenDoor door = new OpenDoor(); OpenWindow window = new OpenWindow() ) 
{

}

No need to close the above resources in finally block in this case.

Solution 2

You have to use Java 7 to use the try-with-resources statement.
Also the try-with-resources block uses the AutoClosable interface, so leave out those closes in your finally-block. They will be invoked automatically.
If you want to use a BufferedReader try this:

try (BufferedReader bufRead = new BufferedReader(new FileReader(this.fileName))) {
      ......        
}catch (FileNotFoundException e) {
      ......
}

You could also use multiple resources like so:

try (FileReader input = new FileReader(this.fileName);
     BufferedReader bufRead = new BufferedReader(input) ) {
          ......        
    }catch (FileNotFoundException e) {
          ......
    }

There's another important thing: If you close a BufferedReader which wraps another Reader, this underlying Reader will be closed, too.

Share:
11,274
Kalec
Author by

Kalec

Student and recent employee. Massive n00b.

Updated on June 09, 2022

Comments

  • Kalec
    Kalec almost 2 years

    TO CLARIFY: I can't even compile due to messages from Eclipse. First code snippet: input and inputBuffer are not recognized. Second code snippet, Eclipse wants me to switch switch "Compliance and JRE to 1.7"

    I am new to try-with-resources and I can't quite understand the syntax or what I'm doing wrong. Here is my code

    try {
       FileReader input = new FileReader(this.fileName);
       BufferedReader  inputBuffer = new BufferedReader (input);
    
       String line;
       while ((line = inputBuffer.readLine()) != null) {
           String[] inputData = line.split(",");
    
            Node<Integer> newNode = new Node<Integer>(Integer.parseInt(inputData[0]),
                                                      Integer.parseInt(inputData[1]));
            this.hashMap.add(newNode);
       }
    
    //inputBuffer.close();
    //input.close();
    
    }catch (NumberFormatException nfe){
        System.out.println(
             "Repository could not load data due to NumberFormatException: " + nfe); 
    }catch (FileNotFoundException fnfe) {
        System.out.println("File not found, error: " + fnfe);
    }finally { 
        inputBuffer.close();
        input.close();
    }
    

    The finally block does not work, so i wanted to try

    try (FileReader input = new FileReader(this.fileName)) {
          ......        
    }catch (FileNotFoundException e) {
          ......
    }finally {
          inputBuffer.close();
          input.close();
    }
    

    However

    • I should also add BufferedReader to try (...) ... but how ?

    • Also this requires me to switch "Compliance and JRE to 1.7". I don't know what that means and how that would affect my program so far, I'm not willing to do it until someone explains what it all means or if I'm doing something wrong.

    EDIT

    I moved declaration before try block and initialized with null, is this "ok" ?

    FileReader input = null;
    BufferedReader  inputBuffer = null;
    
    try {
        input = new FileReader(this.fileName);
        inputBuffer = new BufferedReader (input);
        ...
    }   ...