java - sts - spring initializr
System.console() devuelve nulo (10)
Estaba usando readLine
of BufferedReader
para obtener una contraseña de entrada / nueva del usuario, pero quería enmascarar la contraseña, así que estoy tratando de usar la clase java.io.Console
. El problema es que System.console()
devuelve null
cuando una aplicación se depura en Eclipse. Soy nuevo en Java y no estoy seguro de que Eclipse sea la mejor forma de lograrlo? Hago clic con el botón derecho en el archivo fuente y selecciono "Depurar como"> "Aplicación Java". ¿Hay algún trabajo alrededor?
Creo que en las configuraciones de ejecución para Eclipse, puede configurar si desea asignar una consola o no: asegúrese de que esté marcada. (Ha pasado un tiempo desde que utilicé Eclipse, así que no puedo dar instrucciones específicas, me temo).
Si eso no funciona, algo que definitivamente hará este trabajo es iniciar su aplicación en modo de depuración, luego conectarse al proceso con Eclipse. Busque "depuración remota de eclipse" si no está seguro de cómo hacerlo.
Además, en general, es una mala idea requerir que se le asigne una consola, ya que esto afecta mucho la flexibilidad de su aplicación, como acaba de descubrir. Muchas formas de invocar a Java no asignarán una consola, y su aplicación no se puede usar en estas instancias (lo cual es malo). Quizás, alternativamente, podría permitir que los argumentos se especifiquen en la línea de comando. (Si está probando la entrada de la consola específicamente, entonces es suficiente, pero sería potencialmente útil para que la gente pueda invocar su aplicación desde scripts y / o servidores sin cabeza, por lo que este tipo de diseño flexible es casi siempre una buena idea . A menudo también conduce a un código mejor organizado).
De acuerdo con la API :
" Si la máquina virtual se inicia desde una línea de comandos interactiva sin redireccionar los flujos de entrada y salida estándar, entonces su consola existirá y, por lo general, se conectará al teclado y la pantalla desde donde se inició la máquina virtual. automáticamente, por ejemplo, mediante un planificador de trabajos en segundo plano, entonces normalmente no tendrá una consola ".
De acuerdo con los docs :
Si la máquina virtual se inicia automáticamente, por ejemplo, mediante un planificador de trabajos en segundo plano, entonces normalmente no tendrá una consola.
Eso es correcto.
Tendrá que ejecutar la aplicación fuera de Eclipse. Mire los paneles de configuración del iniciador dentro de Eclipse y vea si puede encontrar la opción que dice ejecutar el comando en una JVM separada.
Este es un error # 122429 de eclipse
Este fragmento de código debería hacer el truco:
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();
}
Mientras prueba en Eclipse, su contraseña ingresada aparecerá en claro. Al menos, podrás probar. Simplemente no escriba su contraseña real mientras prueba. Mantenga eso para uso de producción;).
Obtuve este mensaje de error al ejecutar la aplicación desde Netbeans. A juzgar por las otras respuestas, parece que esto sucede cuando ejecuta su aplicación desde un IDE. Si echas un vistazo a esta pregunta: tratando de leer desde la consola en Java , es porque
La mayoría de los IDE utilizan javaw.exe en lugar de java.exe para ejecutar código Java
Use la línea de comando / terminal para obtener la Console
.
También encontré este problema cuando intento escribir una aplicación de línea de comando simple.
Otra alternativa para crear su propio objeto BufferedReader desde System.in es usar java.util.Scanner de esta manera:
import java.util.Scanner;
Scanner in;
in = new Scanner(System.in);
String s = in.nextLine();
Por supuesto, esto no será un reemplazo directo a la consola, sino que le dará acceso a una variedad de funciones de entrada diferentes.
Aquí hay más documentación sobre Scanner de Oracle .
agrega -console en los argumentos de tu programa para iniciar la consola OSGi
System.console()
devuelve null si no hay consola.
Puede solucionar esto agregando una capa de direccionamiento indirecto a su código o ejecutando el código en una consola externa y adjuntando un depurador remoto .