System.console () devuelve nulo

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?

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;).

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 .

También encontré este problema cuando bash 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 .

De acuerdo con los documentos :

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.

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 “.

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).

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 .

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.

agrega -console en los argumentos de tu progtwig para iniciar la consola OSGi