我正在尝试使用JDK11提供的JShell运行一些简单的命令。但是当我键入:

jshell>System.out.println("Hello World!");


它给了我错误:

Exception in thread "main" java.lang.NullPointerException: charsetName
        at java.base/java.lang.String.<init>(String.java:464)
        at java.base/java.lang.String.<init>(String.java:537)
        at jdk.internal.le/jdk.internal.jline.extra.AnsiInterpretingOutputStream.write(AnsiInterpretingOutputStream.java:92)
        at java.base/java.io.OutputStream.write(OutputStream.java:157)
        at java.base/sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:233)
        at java.base/sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:312)
        at java.base/sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:316)
        at java.base/sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:153)
        at java.base/java.io.OutputStreamWriter.flush(OutputStreamWriter.java:254)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.flush(ConsoleReader.java:1052)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.accept(ConsoleReader.java:2029)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:2756)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:2383)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:2371)
        at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readLine(ConsoleIOContext.java:142)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.getInput(JShellTool.java:1261)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1174)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:975)
        at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:254)
        at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)


然后结束JShell程序。

我的java版本如下:

java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

最佳答案

事实证明,在产生新的CMD时打印活动代码页是罪魁祸首。例如,尝试运行cmd.exe并查看是否得到类似的输出:

Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.
Active code page: 65001


编写诸如import语句之类的代码行或上述打印hello world的情况后,这会崩溃。 JShell显然期望其他东西。

活动代码页的附加输出似乎也引发了许多其他解析器。实际上,我是通过运行mvn release时发生的另一个异常遇到此问题的。事实证明,Maven的发布插件大量使用cmd.exe并尝试解析输出。这样会产生有趣的异常:

Caused by: java.net.URISyntaxException: Illegal character in scheme name at index 6: Active%20code%20page:%2065001
C:/Users/USER_NAME/git/SOME_PROJECT
    at java.net.URI$Parser.fail (URI.java:2915)
    at java.net.URI$Parser.checkChars (URI.java:3086)
    at java.net.URI$Parser.parse (URI.java:3112)
    at java.net.URI.<init> (URI.java:600)
    at java.net.URI.create (URI.java:881)
    at org.apache.maven.scm.provider.git.gitexe.command.status.GitStatusConsumer.resolveURI (GitStatusConsumer.java:249)




我必须通过运行AutoRun命令的regedit禁用chcp 65001
可以在以下任一路径中找到它:


  HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Command Processor \ AutoRun
  HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor \ AutoRun


以下SO答案将提供有关此信息的更多信息,并且是该问题的最终答案:
https://stackoverflow.com/a/48203959/540873

请注意,AutoRun中的任何其他命令也可能会发生这种情况,而在我的情况下,这只是ECHO命令。



Java版本供参考:

java version "11.0.2" 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

07-24 22:14