-
Bug
-
Resolution: Fixed
-
P4
-
8, 11, 12, 13
-
b17
-
generic
-
generic
-
Verified
ADDITIONAL SYSTEM INFORMATION :
java -version:
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+9)
OpenJDK 64-Bit Server VM (build 13-ea+9, mixed mode, sharing)
Windows 10 Home, Version 1803, Build 17134.590
A DESCRIPTION OF THE PROBLEM :
If the underlying WritableByteChannel errors when closing a sun.nio.cs.StreamEncoder (as returned by Channels.newWriter), then the channel is not closed.
This is somewhat similar toJDK-6266377, but is not dependent on using a BufferedWriter.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
- Create a subclass of WritableByteChannel which errors when calling .write, and prints some debugging message when closing.
- Use Channels.newWriter to wrap an instance of this channel.
- Write to the writer, and then close it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The channel would be closed the exception thrown from .write() is propagated.
ACTUAL -
The channel is not closed, and the error from .write() is thrown.
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
import java.nio.charset.StandardCharsets;
class Scratch
{
public static void main( String[] args )
{
ErroringByteChannel channel = new ErroringByteChannel();
try( Writer writer = Channels.newWriter( channel, StandardCharsets.UTF_8.newEncoder(), -1 ) )
{
writer.write( "Test" );
}
catch( IOException e )
{
e.printStackTrace();
}
}
private static class ErroringByteChannel implements WritableByteChannel
{
private boolean open = true;
@Override
public int write( ByteBuffer src ) throws IOException
{
throw new IOException();
}
@Override
public boolean isOpen()
{
return open;
}
@Override
public void close()
{
open = false;
System.out.println( "Closing" );
}
}
}
---------- END SOURCE ----------
java -version:
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+9)
OpenJDK 64-Bit Server VM (build 13-ea+9, mixed mode, sharing)
Windows 10 Home, Version 1803, Build 17134.590
A DESCRIPTION OF THE PROBLEM :
If the underlying WritableByteChannel errors when closing a sun.nio.cs.StreamEncoder (as returned by Channels.newWriter), then the channel is not closed.
This is somewhat similar to
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
- Create a subclass of WritableByteChannel which errors when calling .write, and prints some debugging message when closing.
- Use Channels.newWriter to wrap an instance of this channel.
- Write to the writer, and then close it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The channel would be closed the exception thrown from .write() is propagated.
ACTUAL -
The channel is not closed, and the error from .write() is thrown.
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
import java.nio.charset.StandardCharsets;
class Scratch
{
public static void main( String[] args )
{
ErroringByteChannel channel = new ErroringByteChannel();
try( Writer writer = Channels.newWriter( channel, StandardCharsets.UTF_8.newEncoder(), -1 ) )
{
writer.write( "Test" );
}
catch( IOException e )
{
e.printStackTrace();
}
}
private static class ErroringByteChannel implements WritableByteChannel
{
private boolean open = true;
@Override
public int write( ByteBuffer src ) throws IOException
{
throw new IOException();
}
@Override
public boolean isOpen()
{
return open;
}
@Override
public void close()
{
open = false;
System.out.println( "Closing" );
}
}
}
---------- END SOURCE ----------
- links to