Я использовал readLine
для BufferedReader
, чтобы получить ввод/новый пароль от пользователя, но хотел скрыть пароль, поэтому я пытаюсь использовать класс java.io.Console
. Проблема в том, что System.console()
возвращает null
, когда приложение отлаживается в Eclipse. Я новичок в Java и Eclipse не уверен, что это лучший способ достичь? Я нажимаю правой кнопкой мыши на исходный файл и выбираю "Debug As" > "Java Application". Есть ли способ обхода?
System.console() возвращает значение null
Ответ 1
Это ошибка # 122429 eclipse
Ответ 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 ваш пароль будет отображаться в ясном виде. По крайней мере, вы сможете протестировать. Просто не вводите свой реальный пароль во время тестирования. Держите это для использования в производстве;).
Ответ 3
System.console()
возвращает null, если консоль отсутствует.
Вы можете обойти это либо добавление слоя косвенности к вашему коду или запуск кода на внешней консоли и с удаленным отладчиком.
Ответ 4
Я также столкнулся с этой проблемой при попытке написать простое приложение командной строки.
Другой альтернативой созданию собственного объекта BufferedReader из System.in является использование java.util.Scanner следующим образом:
import java.util.Scanner;
Scanner in;
in = new Scanner(System.in);
String s = in.nextLine();
Конечно, это не будет заменой на консоль, но даст вам доступ к различным функциям ввода.
Ответ 5
В соответствии с docs:
Если виртуальная машина запускается автоматически, например, с помощью планировщика фонового задания, то обычно не будет консоли.
Ответ 6
В соответствии с API:
"Если виртуальная машина запущена из интерактивной командной строки без перенаправления стандартных потоков ввода и вывода, то ее консоль будет существовать и, как правило, будет подключена к клавиатуре и дисплею, с которого была запущена виртуальная машина. Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, тогда обычно не будет консоли."
Ответ 7
Я считаю, что в конфигурациях запуска для Eclipse вы можете настроить, нужно ли назначать консоль или нет - убедитесь, что это проверено. (Прошло некоторое время с тех пор, как я использовал Eclipse, поэтому я не могу дать конкретные инструкции, которых я боюсь).
Если это не сработает, то то, что определенно сделает это задание, запустит ваше приложение в режиме отладки, а затем подключится к процессу с помощью Eclipse. Найдите "удаленную отладку eclipse", если вы не знаете, как это сделать.
Кроме того, в общем случае, это плохая идея требовать, чтобы консоль была назначена, поскольку это очень сильно влияет на гибкость вашего приложения - как вы только что обнаружили. Многие способы вызова Java не будут назначать консоль, и ваше приложение не будет использоваться в этих случаях (что плохо). Возможно, вы могли бы альтернативно разрешить аргументы в командной строке. (Если вы тестируете вход в консоль конкретно, то достаточно справедливы, но потенциально может быть полезно, чтобы люди могли вызывать ваше приложение из сценариев и/или на безгласных серверах, поэтому такой гибкий дизайн почти всегда является хорошей идеей Это часто приводит к получению более организованного кода.)
Ответ 8
Это правильно.
Вам нужно будет запустить приложение вне Eclipse. Посмотрите на панели конфигурации пусковой установки в Eclipse и посмотрите, можете ли вы определить параметр, который говорит, чтобы запустить команду в отдельной JVM.
Ответ 9
добавьте -console в свои аргументы программы, чтобы запустить консоль OSGi