System.console() возвращает значение null

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

Ответ 2

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

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 ваш пароль будет отображаться в ясном виде. По крайней мере, вы сможете протестировать. Просто не вводите свой реальный пароль во время тестирования. Держите это для использования в производстве;).

Ответ 4

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

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

import java.util.Scanner;

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

String s = in.nextLine();

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

Здесь дополнительная документация по сканерам из Oracle.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Если это не сработает, то то, что определенно сделает это задание, запустит ваше приложение в режиме отладки, а затем подключится к процессу с помощью Eclipse. Найдите "удаленную отладку eclipse", если вы не знаете, как это сделать.

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

Ответ 8

Это правильно.

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

Ответ 9

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