ADDITIONAL SYSTEM INFORMATION :
21 is Ubuntu 24.04 in WSL
The other is Windows 11 23H2
openjdk 25-ea 2025-09-16
OpenJDK Runtime Environment (build 25-ea+25-3096)
OpenJDK 64-Bit Server VM (build 25-ea+25-3096, mixed mode, sharing)
openjdk 21.0.7 2025-04-15
OpenJDK Runtime Environment (build 21.0.7+6-Ubuntu-0ubuntu124.04)
OpenJDK 64-Bit Server VM (build 21.0.7+6-Ubuntu-0ubuntu124.04, mixed mode, sharing)
openjdk 17.0.6 2023-01-17
OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10)
OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing)
openjdk 11.0.18 2023-01-17
OpenJDK Runtime Environment Temurin-11.0.18+10 (build 11.0.18+10)
OpenJDK 64-Bit Server VM Temurin-11.0.18+10 (build 11.0.18+10, mixed mode)
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
A DESCRIPTION OF THE PROBLEM :
System.in.readAllBytes() and System.in.read() in JShell cannot be executed because it throws jdk.internal.org.jline.reader.EndOfFileException every time.
The function is helpful for investigating input-related bugs likeJDK-8356165.
Also, other methods that read a string from stdin like IO.readln() or System.console().readLine() fail if Ctrl + D is immediately typed even though they have to return -1 or null.
This bug hinders teaching beginners the importance of null handling in using IO.readln().
This bug can be reproduced even in JShell in Java 11 (since a version newer than 11.0.2)/17 or a non-Windows OS.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Launch `jshell "-J-Duser.language=en"`
A:
2. Type `System.in.readAllBytes()` and press Enter
3. Press Ctrl + D immediately without extra input, or input some string and press Enter → Ctrl + D
B:
2. Type `System.in.read()` or `System.console().reader().read()` and press Enter
3. Press Ctrl + D immediately without extra input
C:
2. Type `System.console().readLine()`, `IO.readln()` (requires --enable-preview in Java 23 or 24), or `System.console().readPassword()`
3. Press Ctrl + D immediately without extra input
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A: Prints a byte array representing the input string
B: Returns -1
C: Returns null
ACTUAL -
jdk.internal.org.jline.reader.EndOfFileException (EOFException in readAllBytes in Java 11.0.18) is thrown.
JShell 25 (ea+25):
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().reader().read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole$2.read(JShellTool.java:4124)
at java.base/java.io.Reader.read(Reader.java:332)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:379)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readLine()
Exception in thread "output reader" | State engine terminated.
jdk.internal.org.jline.reader.EndOfFileException
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserLine(ConsoleIOContext.java:1023)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readLine(JShellTool.java:4142)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:388)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> IO.readln()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readPassword()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readPassword(ConsoleIOContext.java:1054)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readPassword(JShellTool.java:4153)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:401)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
JShell 21:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
| Restore definitions with: /reload -restore
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().reader().read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole$2.read(JShellTool.java:4076)
at java.base/java.io.Reader.read(Reader.java:240)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:350)
| Restore definitions with: /reload -restore at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readLine()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserLine(ConsoleIOContext.java:997)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readLine(JShellTool.java:4094)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:359)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
| State engine terminated.
| Restore definitions with: /reload -restore
$1 ==>
jshell> System.console().readPassword()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readPassword(ConsoleIOContext.java:1023)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readPassword(JShellTool.java:4103)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:368)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
JShell 17:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" | State engine terminated.jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
JShell 11.0.18:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
| State engine terminated.
| Restore definitions with: /reload -restore
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
| State engine terminated. at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
| Restore definitions with: /reload -restore at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
JShell 11.0.2 does not throw exceptions but the result of System.in.read() is wrong and System.in.readAllBytes() cannot be finished by Ctrl + D.
The result of System.in.readNBytes(6) equals to "null\r\n".getBytes().
jshell> System.in.read()
$1 ==> 110
jshell> System.in.readNBytes(6)
$1 ==> byte[6] { 110, 117, 108, 108, 13, 10 }
---------- BEGIN SOURCE ----------
// The bug is JShell only, so the following code WORKS AS INTENDED WITHOUT EXCEPTIONS
// readAllBytes #1: ^D
// input: <empty bytes>
// readAllBytes #2: ^D
// input: <empty bytes>
// System.console().readLine(): ^D
// input: <null>
// read(): ^D
// First byte: -1
import java.io.IOException;
import java.nio.charset.Charset;
class SystemInBug {
public static void main(String[] args) {
// Charset.forName(String, Charset) is only available in Java 18 and later
var charsetName = System.getProperty("stdin.encoding",
System.getProperty("stdout.encoding", System.getProperty("sun.stdout.encoding", null)));
var charset = charsetName != null ? Charset.forName(charsetName) : Charset.defaultCharset();
try {
System.err.print("readAllBytes #1: ");
var one = System.in.readAllBytes();
System.out.println("input: " + (one.length > 0 ? new String(one, charset) : "<empty bytes>"));
System.err.print("readAllBytes #2: ");
var two = System.in.readAllBytes();
System.out.println("input: " + (two.length > 0 ? new String(two, charset) : "<empty bytes>"));
System.err.print("System.console().readLine(): ");
var line = System.console().readLine();
System.out.println("input: " + (line == null ? "<null>" : line.length() == 0 ? "<empty string>" : line));
System.err.print("read(): ");
var firstByte = System.in.read();
System.out.println("First byte: " + (firstByte == -1 ? Integer.toString(firstByte) : String.format("%d (0x%02X)", firstByte, firstByte)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
---------- END SOURCE ----------
21 is Ubuntu 24.04 in WSL
The other is Windows 11 23H2
openjdk 25-ea 2025-09-16
OpenJDK Runtime Environment (build 25-ea+25-3096)
OpenJDK 64-Bit Server VM (build 25-ea+25-3096, mixed mode, sharing)
openjdk 21.0.7 2025-04-15
OpenJDK Runtime Environment (build 21.0.7+6-Ubuntu-0ubuntu124.04)
OpenJDK 64-Bit Server VM (build 21.0.7+6-Ubuntu-0ubuntu124.04, mixed mode, sharing)
openjdk 17.0.6 2023-01-17
OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10)
OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing)
openjdk 11.0.18 2023-01-17
OpenJDK Runtime Environment Temurin-11.0.18+10 (build 11.0.18+10)
OpenJDK 64-Bit Server VM Temurin-11.0.18+10 (build 11.0.18+10, mixed mode)
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
A DESCRIPTION OF THE PROBLEM :
System.in.readAllBytes() and System.in.read() in JShell cannot be executed because it throws jdk.internal.org.jline.reader.EndOfFileException every time.
The function is helpful for investigating input-related bugs like
Also, other methods that read a string from stdin like IO.readln() or System.console().readLine() fail if Ctrl + D is immediately typed even though they have to return -1 or null.
This bug hinders teaching beginners the importance of null handling in using IO.readln().
This bug can be reproduced even in JShell in Java 11 (since a version newer than 11.0.2)/17 or a non-Windows OS.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Launch `jshell "-J-Duser.language=en"`
A:
2. Type `System.in.readAllBytes()` and press Enter
3. Press Ctrl + D immediately without extra input, or input some string and press Enter → Ctrl + D
B:
2. Type `System.in.read()` or `System.console().reader().read()` and press Enter
3. Press Ctrl + D immediately without extra input
C:
2. Type `System.console().readLine()`, `IO.readln()` (requires --enable-preview in Java 23 or 24), or `System.console().readPassword()`
3. Press Ctrl + D immediately without extra input
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A: Prints a byte array representing the input string
B: Returns -1
C: Returns null
ACTUAL -
jdk.internal.org.jline.reader.EndOfFileException (EOFException in readAllBytes in Java 11.0.18) is thrown.
JShell 25 (ea+25):
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().reader().read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole$2.read(JShellTool.java:4124)
at java.base/java.io.Reader.read(Reader.java:332)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:379)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readLine()
Exception in thread "output reader" | State engine terminated.
jdk.internal.org.jline.reader.EndOfFileException
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserLine(ConsoleIOContext.java:1023)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readLine(JShellTool.java:4142)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:388)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> IO.readln()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:1011)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:988)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:203)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readPassword()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:696)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:552)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:523)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1041)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readPassword(ConsoleIOContext.java:1054)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readPassword(JShellTool.java:4153)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:401)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
JShell 21:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
| Restore definitions with: /reload -restore
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
| Restore definitions with: /reload -restore
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:975)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:197)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:184)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().reader().read()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInputChar(ConsoleIOContext.java:985)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole$2.read(JShellTool.java:4076)
at java.base/java.io.Reader.read(Reader.java:240)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:350)
| Restore definitions with: /reload -restore at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
jshell> System.console().readLine()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserLine(ConsoleIOContext.java:997)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readLine(JShellTool.java:4094)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:359)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
| State engine terminated.
| Restore definitions with: /reload -restore
$1 ==>
jshell> System.console().readPassword()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:697)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:553)
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:524)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.doReadUserLine(ConsoleIOContext.java:1010)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readPassword(ConsoleIOContext.java:1023)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$IOContextConsole.readPassword(JShellTool.java:4103)
at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:368)
at java.base/java.io.OutputStream.write(OutputStream.java:167)
at java.base/java.io.OutputStream.write(OutputStream.java:124)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
$1 ==>
JShell 17:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
| Restore definitions with: /reload -restore at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated.
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" | State engine terminated.jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:1003)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:192)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:162)
at java.base/java.io.OutputStream.write(OutputStream.java:127)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
JShell 11.0.18:
jshell> System.in.readAllBytes()
Exception in thread "output reader" jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
| State engine terminated.
| Restore definitions with: /reload -restore
$1 ==>
jshell> System.in.readAllBytes()
foo
Exception in thread "output reader" java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
jdk.internal.org.jline.reader.EndOfFileException
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
| State engine terminated. at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
| Restore definitions with: /reload -restore at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
jshell> System.in.read()
Exception in thread "output reader" java.io.EOFException
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:3432)
at java.base/java.io.ObjectInputStream.readInt(ObjectInputStream.java:1106)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.readAndReportExecutionResult(StreamingExecutionControl.java:277)
at jdk.jshell/jdk.jshell.execution.StreamingExecutionControl.invoke(StreamingExecutionControl.java:99)
at jdk.jshell/jdk.jshell.execution.JdiDefaultExecutionControl.invoke(JdiDefaultExecutionControl.java:160)
at jdk.jshell/jdk.jshell.Eval.declare(Eval.java:881)
at jdk.jshell/jdk.jshell.Eval.eval(Eval.java:140)
at jdk.jshell/jdk.jshell.JShell.eval(JShell.java:493)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSource(JShellTool.java:3563)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processSourceCatchingReset(JShellTool.java:1310)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.processInput(JShellTool.java:1208)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1181)
at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:980)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
jdk.internal.org.jline.reader.EndOfFileException
| State engine terminated. at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:657)
at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readUserInput(ConsoleIOContext.java:949)
| Restore definitions with: /reload -restore at jdk.jshell/jdk.internal.jshell.tool.JShellTool$1.read(JShellTool.java:194)
at jdk.jshell/jdk.jshell.execution.Util$2.write(Util.java:173)
at java.base/java.io.OutputStream.write(OutputStream.java:157)
at java.base/java.io.OutputStream.write(OutputStream.java:122)
at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:72)
$1 ==>
JShell 11.0.2 does not throw exceptions but the result of System.in.read() is wrong and System.in.readAllBytes() cannot be finished by Ctrl + D.
The result of System.in.readNBytes(6) equals to "null\r\n".getBytes().
jshell> System.in.read()
$1 ==> 110
jshell> System.in.readNBytes(6)
$1 ==> byte[6] { 110, 117, 108, 108, 13, 10 }
---------- BEGIN SOURCE ----------
// The bug is JShell only, so the following code WORKS AS INTENDED WITHOUT EXCEPTIONS
// readAllBytes #1: ^D
// input: <empty bytes>
// readAllBytes #2: ^D
// input: <empty bytes>
// System.console().readLine(): ^D
// input: <null>
// read(): ^D
// First byte: -1
import java.io.IOException;
import java.nio.charset.Charset;
class SystemInBug {
public static void main(String[] args) {
// Charset.forName(String, Charset) is only available in Java 18 and later
var charsetName = System.getProperty("stdin.encoding",
System.getProperty("stdout.encoding", System.getProperty("sun.stdout.encoding", null)));
var charset = charsetName != null ? Charset.forName(charsetName) : Charset.defaultCharset();
try {
System.err.print("readAllBytes #1: ");
var one = System.in.readAllBytes();
System.out.println("input: " + (one.length > 0 ? new String(one, charset) : "<empty bytes>"));
System.err.print("readAllBytes #2: ");
var two = System.in.readAllBytes();
System.out.println("input: " + (two.length > 0 ? new String(two, charset) : "<empty bytes>"));
System.err.print("System.console().readLine(): ");
var line = System.console().readLine();
System.out.println("input: " + (line == null ? "<null>" : line.length() == 0 ? "<empty string>" : line));
System.err.print("read(): ");
var firstByte = System.in.read();
System.out.println("First byte: " + (firstByte == -1 ? Integer.toString(firstByte) : String.format("%d (0x%02X)", firstByte, firstByte)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
---------- END SOURCE ----------
- relates to
-
JDK-8356165 System.in in jshell replace supplementary characters with ??
-
- Resolved
-
-
JDK-8215438 jshell tool: Ctrl-D causes EOF
-
- Closed
-