Ошибка Jshell: java.lang.NullPointerException: charsetName

Я пытаюсь использовать JShell, предоставленный JDK11, для запуска какой-то простой команды. Но когда я печатаю:

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)

person RainSugar    schedule 23.12.2018    source источник
comment
Изменяли ли вы какую-либо из начальных конфигураций для запуска jshell? Это невозможно воспроизвести, если вы не укажете, какие шаги вы выполнили. Было бы хорошо обновить вопрос, указав также точную версию используемого JDK.   -  person Naman    schedule 23.12.2018
comment
Я так не думаю, я только что нашел, что такое jshell, и впервые попробовал поиграть с ним.   -  person RainSugar    schedule 24.12.2018
comment
Не уверен, что кто-то здесь может помочь, если только он не может воспроизвести то же самое или без дополнительных сведений об исключении.   -  person Naman    schedule 24.12.2018


Ответы (1)


Оказывается, виновата печать активной кодовой страницы при создании нового CMD. Например, попробуйте запустить cmd.exe и посмотрите, получите ли вы похожий вывод:

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

Это дает сбой после написания строки кода, такой как оператор импорта или описанный выше случай печати 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 сделает, в моем случае это была только команда chcp.


Версия 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)
person Thomas Jungblut    schedule 23.01.2019
comment
та же проблема с OpenJDK openjdk версии 11.0.2 2019-01-15 в Windows PowerShell с chcp 65001 (те же проблемы с chcp 28591 (iso-8859-1), 65000 (utf-7), 20127 (us-ascii). Настройка chcp Проблема решена с помощью 1252 или 850. Ну, частично, потому что вывод неверен: System.out.println("é") излучает Ú. Спасибо, что определили это. - person jgran; 29.03.2019
comment
сама печать не виновата, но, похоже, проблема с 65001 - person Leonard Brünings; 24.04.2019
comment
да вы правы, в корпусе корпуса это основная проблема. У меня была проблема с maven в первую очередь, которая определенно зависела от вывода разветвленного процесса. Извините, что смешиваю здесь две проблемы. - person Thomas Jungblut; 24.04.2019