try-with-resources and null resource

Joe Darcy joe.darcy at oracle.com
Fri Jan 21 11:38:31 PST 2011


Rémi Forax wrote:
> I think try-with-resources should do a null check before entering in the 
> try block.
>
> 4. try(AutoCloseable c = null) {
> 5.     // nothing
> 6. }
>
> $ java TryWithresourceNPE
> Exception in thread "main" java.lang.NullPointerException
>      at TryWithresourceNPE.main(TryWithresourceNPE.java:6)
>
> I got a NPE from the ends of the try block, I think it will be better to 
> detect the case
> before entering in the try block like foreach or switch does.
>
> And with this code:
>
> 5. try(InputStream i = null) {
> 6.       i.available();
> 7. }
>
> I got the exception below which is not understandable if you don't know
> how try-with-resources is translated.
>
> $ java TryWithresourceNPE
> Exception in thread "main" java.lang.NullPointerException
>      at TryWithresourceNPE.main(TryWithresourceNPE.java:6)
>      Suppressed: java.lang.NullPointerException
>          at TryWithresourceNPE.main(TryWithresourceNPE.java:7)
>   

I'm not too concerned about that stacktrace since the primary exception 
points to the right location.

> If the nullcheck is done before entering in the try block,
> the exception will be:
> Exception in thread "main" java.lang.NullPointerException
>      at TryWithresourceNPE.main(TryWithresourceNPE.java:5)
> which is in my opinion much better.
>
> Rémi
> PS: the nullcheck can be done easily by calling getClass() on the expression
>
> 4. try(AutoCloseable c = null) {
> 5.     // nothing
> 6. }
>
> will be translated to
>
> aconst_null
> dup
> invokevirtual java/lang/Object getClass ()Ljava/lang/Class;
> astore local_slot_of_c
>
>   

Yes, javac internal uses that idiom for null checks and the JVM knows 
how to optimize this well :-)

-Joe




More information about the coin-dev mailing list