On Thu, 8 Feb 2018 13:26:25 +0000, sebb wrote:
On 8 February 2018 at 12:54, Gilles <gil...@harfang.homelinux.org> wrote:
On Thu, 8 Feb 2018 12:42:55 +0000, sebb wrote:

On 8 February 2018 at 12:08, Gilles <gil...@harfang.homelinux.org> wrote:

Hi.

On Thu, 08 Feb 2018 11:55:10 -0000, s...@apache.org wrote:


Author: sebb
Date: Thu Feb  8 11:55:10 2018
New Revision: 1823550

URL: http://svn.apache.org/viewvc?rev=1823550&view=rev
Log:
NET-643 NPE when closing telnet stream

[...]

Modified:





commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetClient.java
URL:





http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetClient.java?rev=1823550&r1=1823549&r2=1823550&view=diff





==============================================================================
---





commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetClient.java
(original)
+++





commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetClient.java
Thu Feb  8 11:55:10 2018
@@ -100,10 +100,16 @@ public class TelnetClient extends Telnet

     void _flushOutputStream() throws IOException
     {
+        if (_output_ == null) {
+            throw new IOException("Stream closed");
+        }
         _output_.flush();
     }
     void _closeOutputStream() throws IOException
     {
+        if (_output_ == null) {
+            return;
+        }
         try {
             _output_.close();
         } finally {



Why the difference in behaviour?


See NET-643


I did, before writing my first reply.

close() is supposed to be idempotent; flush() is not supposed to be
called on a closed stream.


No such requirement here:
https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html#flush--

I was going by the Javadoc here:


https://docs.oracle.com/javase/8/docs/api/java/io/OutputStreamWriter.html#close--

It seems to me that ignoring flush is not the right thing to do.

The doc which you refer to reads:
---CUT---
 Closes the stream, flushing it first. Once the stream has been closed,
 further write() or flush() invocations will cause an IOException to be
 thrown. Closing a previously closed stream has no effect.
---CUT---

IIUC, the first means that, functionally, "close()" works as the
following sequence:
  out.flush();
  out.close();

However, if one does
  out.close();
  out.close();
it's fine, but
  out.flush();
  out.close();
  out.flush();
  out.close();
would throw IOException.

I don't understand how useful it is to make a difference between
two similar situations. [Calling "flush" after "close" with no
intervening "write" is asking to "transfer no data"; so no harm
done IMHO...]
Anyways, if the goal is to comply with the JDK "logic", no problem. :-)

Gilles

In the former case, "no-op" seems equally fine.


It was not a no-op; it was NPE.


In the commit which I referred to, you added a "no-op" for
"close()" and my comment is that the same can be done for
"flush()" in the same circumstance (ie. no-op when "_output_"
is null).


Gilles


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to