我正在尝试使用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)