@arsenii11

Почему не работает ввод с клавиатуры?

В книге Хорстманна "Библиотека профессионала" наткнулся на код для считывания данных с клавиатуры, но при попытке запуска идентичного кода на моем компьютере, компилятор выдает ошибку. 35d2636eda894718a7794cca698f4c0b.png
А теперь вопрос: что в этом коде не так и как его исправить, или хотя бы почему в строке "Console consol = System.console();" значение consol становится null?
Ошибка, выдаваемая компилятором, крупным планом:bfde398b374e4ce1908aa3ca2f748c82.png
  • Вопрос задан
  • 3390 просмотров
Пригласить эксперта
Ответы на вопрос 4
@IceJOKER
Web/Android developer
В консоли же написано, что ошибка в файле HelloWorld , 8 строка, NullPointerException .
Ответ написан
timych
@timych
Вам же говорят что NPE произошел :) . На 7 строчке System.console() вернул NULL. На восьмой строчке вы пытаетесь обратится к переменной имеющей значение NULL.

Попробуйте данный пример в другой IDE или из коммандной строки. Похоже что по каким-то причинам к консоли нет доступа.
Да и не привыкайте называть классы с маленькой буквы :)
Ответ написан
@zed_the_dead
Ну, во-первых ошибка выдается не компилятором, а JRE, т.е. рантаймом. И ошибка говорит о том, что в данный момент никакой консоли с запущенной JVM не ассоциированно.

Чтобы понять причину ошибки - нужно понимать, что консоль не обязательно может присутствовать, о чем, собственно, написано в джавадоке:
public static Console console()
Returns the unique Console object associated with the current Java virtual machine, if any.
Returns:
The system console, if any, otherwise null.


Если этот же код запустить руками через cmd (или sh) - все будет работать. При запуске же из Intellij Idea - консоль, не ассоциируется. Если нужно чтобы работало и так и так - в качестве воркераунда можно использовать java.util.Scanner, натравив его на System.in, можно даже дописать свой метод со строкой для вывода:
public class Test {
    static java.util.Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        readLine("enter code:")
    }

    private String readLine(String prompt) {
        System.out.println(prompt)
        return scanner.nextLine()
    }
}


Код не проверял, но принцип должен быть понятен.
Ответ написан
Комментировать
@exenza
Был такой тикет на jetbrains. Там советовали создать лаунчер для запуска консоли. Коммент
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы