@arsenii11

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

В книге Хорстманна "Библиотека профессионала" наткнулся на код для считывания данных с клавиатуры, но при попытке запуска идентичного кода на моем компьютере, компилятор выдает ошибку. 35d2636eda894718a7794cca698f4c0b.png
А теперь вопрос: что в этом коде не так и как его исправить, или хотя бы почему в строке "Console consol = System.console();" значение consol становится null?
Ошибка, выдаваемая компилятором, крупным планом:bfde398b374e4ce1908aa3ca2f748c82.png
  • Вопрос задан
  • 3366 просмотров
Пригласить эксперта
Ответы на вопрос 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. Там советовали создать лаунчер для запуска консоли. Коммент
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект