Saturday, 14 January 2017

Java9: try with resource enhancement

The try-with-resources statement is introduced in java7, it ensures that each resource is closed at the end of the statement.

Syntax
try( resource1;
         resource2;
         …...
         resurce N ) {
}

Prior to Java9, try-with-resources can only manage resources that are declared in the statement.

 public static void writeDataToFile(FileOutputStream fout){

  /* in Java 8, try-with-resources can only manage resources that are declared for the statement */
  try(FileOutputStream out = fout){
   for(int i = 97; i < 110; i++)
    out.write(i);
  }catch(Exception e){
   System.out.println(e.getMessage());
  }
 }

As you see above snippet, I defined the variable ‘out’ inside try-with-resource statement.


From Java9 on wards, if the resource is referenced by a final or effectively final variable, a try-with-resources statement can manage the resource without a new variable being declared.

 public static void writeDataToFile(final FileOutputStream fout){
  try(fout){
   for(int i = 97; i < 110; i++)
    fout.write(i);
  }catch(Exception e){
   System.out.println(e.getMessage());
  }
 }

Test.java

import java.io.FileOutputStream;

public class Test {

 public static void writeDataToFile(final FileOutputStream fout){
  try(fout){
   for(int i = 97; i < 110; i++)
    fout.write(i);
  }catch(Exception e){
   System.out.println(e.getMessage());
  }
 }

}

If you compile the above application in Java9, it runs fine, since the argument to the method writeDataToFile is declared as final, whereas if you try to compile the same application in Java8, you will end up in following error.

$javac Test.java
Test.java:6: error: <identifier> expected
                try(fout){
                        ^
Test.java:6: error: ')' expected
                try(fout){
                         ^
Test.java:6: error: '{' expected
                try(fout){
                          ^
Test.java:7: error: ')' expected
                        for(int i = 97; i < 110; i++)
                                 ^
Test.java:7: error: not a statement
                        for(int i = 97; i < 110; i++)
                           ^
Test.java:7: error: illegal start of type
                        for(int i = 97; i < 110; i++)
                                            ^
Test.java:7: error: not a statement
                        for(int i = 97; i < 110; i++)
                                          ^
Test.java:7: error: ';' expected
                        for(int i = 97; i < 110; i++)
                                                    ^
8 errors



Previous                                                 Next                                                 Home

No comments:

Post a Comment