It turns out that almost nobody closes resources in Java correctly. Programmers either do not use try-finally
block at all, or just put resource.close()
in finally
which is also incorrect (because Throwable
from close()
can shadow Throwable
from try block). Sometimes they put something like IOUtils.closeQuietly()
with is only correct for InputStream
, but not for OutputStream
. try-with-resources
solves all of these problems but there are still huge number of projects written in Java 6.
What is the best way to emulate try-with-resources
in Java 6? Now I use Guava Closer, which is better than nothing but still much uglier than try-with-resources
. Also, there is a pattern called a loan-pattern, but the absence of lambdas in Java makes this pattern very cumbersome. Is there a better way?
I've found a good replacement for
try-with-resources
. It uses Lombok library with annotation processing:However, it doesn't handle exception correctly. This bug is more than 1 year old and still is not closed: https://code.google.com/p/projectlombok/issues/detail?id=384
Though anonymous class is quite verbose, it's still acceptable in java land
If your only problem with
IOUtils.closeQuietly
is that it ignores exceptions on OutputStreams, then you can either simply callclose()
on them, or create your own utility class which automatically treats the two differently, like this:The correct overloaded method will be selected at compile time in all common situations, although if you're passing
OutputStream
s around asCloseable
s then you'll have to change this to do a dynamicinstanceof
check to make sureOutputStream
s always throw exceptions.