Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8358552

EndOfFileException in System.in.read() and IO.readln() etc. in JShell

XMLWordPrintable

    • Cause Known
    • generic
    • generic

      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 ----------

            cstein Christian Stein
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: