JDK-8358552 : EndOfFileException in System.in.read() and IO.readln() etc. in JShell
  • Type: Bug
  • Component: tools
  • Sub-Component: jshell
  • Affected Version: 11,25
  • Priority: P4
  • Status: In Progress
  • Resolution: Unresolved
  • OS: generic
  • CPU: generic
  • Submitted: 2025-06-03
  • Updated: 2025-06-06
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 26
26Unresolved
Related Reports
Relates :  
Relates :  
Description
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 like JDK-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 ----------


Comments
Here are my console commands used with Java 25-ea on Windows' cmd.exe and Powershell showing the expected behaviour when using IO.readln() in the following source program: >type IOreadln.java void main() { IO.println("|%s|".formatted(IO.readln())); } The arguments are ignored by the application - the serve as a description of what to type >java IOreadln.java ^D+Return ^D || >java IOreadln.java 1+2+3+^D+Return 123^D |123| >java IOreadln.java 1+2+3+^D+4+5+6+Return 123^D456 |123456| Now similar inputs but using Ctrl + C to issue an End Of File command - note that no terminal Return is required to end the input: java IOreadln.java ^C |null| >java IOreadln.java 1+2+3+^C 123|null|
06-06-2025

Impact -> M (Somewhere in-between the extremes) Likelihood -> L (Uncommon uses) Workaround -> M (Somewhere in-between the extremes) Priority -> P4
04-06-2025

The observations on WSL 2: JDK 11: Failed, the outputs of jshell are different. JDK 25ea+19: Failed.
04-06-2025