try-with-resources and null resource (original) (raw)

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 aconstnull dup invokevirtual java/lang/Object getClass ()Ljava/lang/Class; astore localslotofc

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