System.console () возвращает ноль - PullRequest
76 голосов
/ 17 ноября 2010

Я использовал readLine из BufferedReader для получения ввода / нового пароля от пользователя, но хотел замаскировать пароль, поэтому я пытаюсь использовать класс java.io.Console. Проблема в том, что System.console() возвращает null при отладке приложения в Eclipse. Я новичок в Java и Eclipse, не уверен, что это лучший способ достичь? Я щелкаю правой кнопкой мыши по исходному файлу и выбираю «Отладка как»> «Приложение Java». Есть ли обходной путь?

Ответы [ 10 ]

35 голосов
/ 14 декабря 2011

Это ошибка # 122429 затмения

32 голосов
/ 26 июня 2012

Этот фрагмент кода должен помочь:

private String readLine(String format, Object... args) throws IOException {
    if (System.console() != null) {
        return System.console().readLine(format, args);
    }
    System.out.print(String.format(format, args));
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
    return reader.readLine();
}

private char[] readPassword(String format, Object... args)
        throws IOException {
    if (System.console() != null)
        return System.console().readPassword(format, args);
    return this.readLine(format, args).toCharArray();
}

Во время тестирования в Eclipse ваш пароль будет показан в открытом виде.По крайней мере, вы сможете проверить.Только не вводите свой реальный пароль во время тестирования.Сохраните это для производственного использования;).

13 голосов
/ 17 ноября 2010

System.console() возвращает ноль, если консоли нет.

Вы можете обойти это, либо добавив слой косвенности к своему коду , либо запустив код во внешней консоли и , подключив удаленный отладчик .

8 голосов
/ 23 сентября 2014

Я также столкнулся с этой проблемой при попытке написать простое приложение командной строки.

Другой альтернативой созданию собственного объекта BufferedReader из System.in является использование java.util.Scanner, например:

import java.util.Scanner;

Scanner in;
in = new Scanner(System.in);

String s = in.nextLine();

Конечно, это не будет заменойКонсоль, но даст вам доступ к множеству различных функций ввода.

Вот больше документации по сканеру от Oracle .

6 голосов
/ 22 августа 2016

В соответствии с API :

"I f виртуальная машина запускается из интерактивной командной строки без перенаправления стандартных потоков ввода и вывода, тогда ее консоль будет существовать иобычно подключается к клавиатуре и дисплею, с которого была запущена виртуальная машина. Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, то она обычно не имеет консоли. "

6 голосов
/ 17 ноября 2010

В соответствии с документами :

Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, то обычно она не имеет консоли.

2 голосов
/ 25 июня 2018

Получил это сообщение об ошибке при запуске приложения из Netbeans.Судя по другим ответам, похоже, что это происходит при запуске приложения из IDE.Если вы посмотрите на этот вопрос: Попытка чтения с консоли на Java , это потому, что

Большинство IDE используют javaw.exe вместо java.exe для запускаJava-код

Решение состоит в том, чтобы использовать command line/terminal для получения Console.

1 голос
/ 17 ноября 2010

Я считаю, что в конфигурациях запуска для Eclipse вы можете настроить, назначать ли консоль или нет - убедитесь, что это проверено. (Прошло много времени с тех пор, как я использовал Eclipse, поэтому я не могу давать конкретные инструкции, боюсь).

Если это не сработает, то что-то, что определенно выполнит эту работу, - это запустить ваше приложение в режиме отладки, а затем подключиться к процессу с помощью Eclipse. Ищите «eclipse remote debugging», если не знаете, как это сделать.

Кроме того, в целом, требует, чтобы была назначена консоль, поскольку это очень сильно влияет на гибкость вашего приложения - как вы только что обнаружили. Многие способы вызова Java не будут назначать консоль, и ваше приложение непригодно в этих случаях (что плохо). Возможно, вы могли бы альтернативно разрешить указание аргументов в командной строке. (Если вы тестируете консольный ввод специально, тогда достаточно справедливо, но для людей было бы полезно иметь возможность вызывать ваше приложение из сценариев и / или безголовых серверов, поэтому такой гибкий дизайн почти всегда является хорошей идеей . Это также часто приводит к более организованному коду.)

0 голосов
/ 17 ноября 2010

добавьте -console в аргументы вашей программы для запуска консоли OSGi

0 голосов
/ 17 ноября 2010

Это верно.

Вам придется запускать приложение за пределами Eclipse.Посмотрите на панели конфигурации модуля запуска в Eclipse и посмотрите, сможете ли вы найти опцию, которая говорит, что команда запускается в отдельной JVM.

...