Kalec
Kalec

Reputation: 2881

Having problems with "try with resources"

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

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);
    ...
}   ...

Upvotes: 4

Views: 13551

Answers (2)

codeMan
codeMan

Reputation: 5758

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.

Upvotes: 6

Zhedar
Zhedar

Reputation: 3510

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.

Upvotes: 7

Related Questions