Sorry if I was unclear. What if creating the Reader fails after the
InputStream was created? Then there is no reader object to call close on...
In not sure that protecting against a NPE is enough, so I want to close the
InputStream in the finally clause. Closing the Reader as well is fine but
optional IMO.

On Friday, August 23, 2013, Gary Gregory wrote:

> Hi Remko,
>
> I tried it both ways and it just looks simpler to read this way. The
> reader passes the close to its wrapped stream. In both cases, you need to
> close the reader (or the stream) and protect that close with a null guard.
>
> Gary
>
>
> On Thu, Aug 22, 2013 at 7:10 PM, Remko Popma <remko.po...@gmail.com>wrote:
>
> Gregory,
> I'm not sure I agree with this fix.
> NPE is not the only reason why creating the reader could fail.
> The input stream is the object associated with the native IO resource (the
> file handle). As such, it is safer to guarantee that the input stream is
> always closed no matter what happens. The Reader is just a java object with
> some char buffer space, and these resources will be GC'ed when it goes out
> of scope.
>
> Remko
>
> PS
>
> Check out Assert#isNotNull in the helpers package. I like using this
> instead of an if statement: short, clearly shows intent, and can be used in
> assignment statements (often convenient in constructors).
>
> On Thursday, August 22, 2013, wrote:
>
> Author: ggregory
> Date: Thu Aug 22 14:58:44 2013
> New Revision: 1516477
>
> URL: http://svn.apache.org/r1516477
> Log:
> Make sure no resources are leaked managing streams and readers.
>
> Modified:
>
> logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
>
> Modified:
> logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java?rev=1516477&r1=1516476&r2=1516477&view=diff
>
> ==============================================================================
> ---
> logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
> (original)
> +++
> logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java
> Thu Aug 22 14:58:44 2013
> @@ -32,6 +32,7 @@ import java.nio.charset.Charset;
>  import java.util.Map;
>  import java.util.concurrent.Executor;
>  import java.util.concurrent.atomic.AtomicLong;
> +
>  import javax.management.MBeanNotificationInfo;
>  import javax.management.Notification;
>  import javax.management.NotificationBroadcasterSupport;
> @@ -186,11 +187,22 @@ public class LoggerContextAdmin extends
>          }
>      }
>
> +    /**
> +     *
> +     * @param uri
> +     * @param charset MUST not be null
> +     * @return
> +     * @throws IOException
> +     */
>      private String readContents(final URI uri, final Charset charset)
> throws IOException {
> -        InputStream in = null;
> +        if (charset == null) {
> +            throw new IllegalArgumentException("charset must not be
> null");
> +        }
> +        Reader reader = null;
>          try {
> -            in = uri.toURL().openStream();
> -            final Reader reader = new InputStreamReader(in, charset);
> +            InputStream in = uri.toURL().openStream();
> +            // The stream is open and charset is not null, we can create
> the reade
>
> --
> E-Mail: garydgreg...@gmail.com <javascript:_e({}, 'cvml',
> 'garydgreg...@gmail.com');> | ggreg...@apache.org <javascript:_e({},
> 'cvml', 'ggreg...@apache.org');>
> Java Persistence with Hibernate, Second 
> Edition<http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>

Reply via email to