Upcoming change in semantics to try-with-resources on a null resource
Rémi Forax
forax at univ-mlv.fr
Wed Feb 16 23:56:22 PST 2011
On 02/17/2011 12:06 AM, Joe Darcy wrote:
> 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
>
Thanks, Joe :)
Rémi
More information about the coin-dev
mailing list