How to terminate resources in try-with-resources

Joe Darcy joe.darcy at oracle.com
Mon Jan 31 19:15:36 PST 2011


Hello.

In addition to mulling over nulling in the try-with-resources statement, 
the JSR 334 expert group has decided to slightly amend the syntax of 
try-with-resources statement: an optional trailing semicolon will now be 
allowed to terminate the list of resources.

Previously, a semicolon could only be used as a separator between two 
resources as in

    try(Resource r0 = new Resource(); Resource r1 = new Resource(); 
Resource r2 = new Resource()) {...}

or reformatted as

    try(Resource r0 = new Resource();
        Resource r1 = new Resource();
        Resource r2 = new Resource()) {...}

However, including an extraneous semicolon at the end of the list would 
be rejected as a syntax error:

    try(Resource r0 = new Resource();
        Resource r1 = new Resource();
        Resource r2 = new Resource();) {...}  // Illegal under JSR 334 EDR!

While requiring a semicolon at the end of a list of resources would be 
excessive, especially when there is only a single resource being 
managed, optionally allowing a terminating resource offers several 
advantages. First, when adding a resource to the list of resources being 
managed, there are fewer necessary edits when cutting and pasting. More 
importantly, programmatic generation of code is simplified since the 
code generation logic does not need to know ahead of time whether or not 
a particular resource will be the last one when the declaration for that 
resource is generated. The simple rule "terminate a resource declaration 
with a semicolon" will result in acceptable code, even if the code is 
not ideal style-wise. Finally, allowing an optional trailing semicolon 
is consistent with the handling of commas in array initializers,

    int[] values = {1,
                    2,
                    3,  // Legal
                   };

and the handling of commas in the declaration of enum constants.

    enum PrimaryColor {
        RED,
        GREEN,
        BLUE,  // Legal
        ;
    }

The full amended grammar for try-with-resources which allows the 
optional trailing semicolon is:

TryStatement:
    try Block Catches
    try Block Catches_opt Finally
    try ResourceSpecification Block Catches_opt Finally_opt

ResourceSpecification:
    ( Resources ;_opt )

Resources:
    Resource
    Resource ; Resources

Resource:
    VariableModifiers_opt Type VariableDeclaratorId = Expression

The necessary compiler changes to implement the revised grammar have 
been pushed into a JDK 7 integration repository [1] and will appear in a 
promoted build in due course.

-Joe

[1] http://hg.openjdk.java.net/jdk7/tl/langtools/rev/2ab47c4cd618




More information about the coin-dev mailing list