Upcoming change in semantics to try-with-resources on a null resource

Joe Darcy joe.darcy at oracle.com
Wed Feb 16 15:06:04 PST 2011


Hello.

After due consideration the JSR 334 expert group has decided the 
semantics of the try-with-resources statement on a null resource should 
be changed as follows: the compiler-generated calls to close a resource 
will only occur if the resource is non-null.

Concretely, the semantics of the desugaring of the finally block are 
changed from
 
finally {
  if (#primaryException != null) {
    try {
      #resource.close();
    } catch(Throwable #suppressedException) {
      #primaryException.addSuppressed(#suppressedException);
    }
  } else {
    #resource.close();
  }
}
 
to
 
finally {
  if (#primaryException != null) {
    try {
      if(#resource != null)
        #resource.close();
    } catch(Throwable #suppressedException) {
      #primaryException.addSuppressed(#suppressedException);
    }
  } else {
      if(#resource != null)
        #resource.close();
  }
}

This decision was informed by discussions on coin-dev as well as 
experiments retrofitting try-with-resources onto the JDK libraries.

The change allows idioms like

try(Resource r = methodThatMightReturnNull()) {
    if (r == null)
       return; // nothing to do
}

to complete normally without generating a null pointer exception.  Note 
that the programmer still has responsibility to check for a null 
resource if the resource is used inside the try block; the generated 
null check does *not* occur before the try block is entered.

Implementing the change is being tracked under Oracle bug 7020047 
"Project Coin: generate null-check around try-with-resources close call."

Thanks for the feedback; cheers,

-Joe



More information about the coin-dev mailing list