83 votes

System.console() retourne null

J'utilisais readLine de BufferedReader pour obtenir une saisie/nouveau mot de passe de l'utilisateur, mais je voulais masquer le mot de passe donc j'essaie d'utiliser la classe java.io.Console. Le problème est que System.console() renvoie null lorsque une application est en mode débogage dans Eclipse. Je suis nouveau en Java et Eclipse, je ne suis pas sûr que ce soit la meilleure méthode pour y parvenir. Je clique avec le bouton droit sur le fichier source et sélectionne "Déboguer en tant que" > "Application Java". Y a-t-il une solution de contournement?

1 votes

Voir aussi stackoverflow.com/questions/26470972/… J'ai identifié System.out et System.in comme étant suffisants pour mon cas d'utilisation et j'ai abandonné l'utilisation de System.console().

37voto

swimmingfisher Points 501

Il s'agit d'un bug #122429 de eclipse

34voto

Ce fragment de code devrait faire l'affaire :

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();
}

Lors des tests dans Eclipse, votre saisie de mot de passe sera affichée en clair. Au moins, vous pourrez tester. Ne saisissez simplement pas votre vrai mot de passe pendant les tests. Gardez-le pour une utilisation en production ;).

0 votes

Votre méthode readLine personnalisée devrait-elle fermer le BufferedReader dans un bloc finally (ou try-with-resources) ?

0 votes

Non car cela fermerait le flux System.in correspondant et aucune lecture ultérieure ne pourrait être effectuée par la suite.

0 votes

Oui, il est étrange que ce flux puisse être fermé ; je m'attendais à ce que ce soit une opération sans effet.

15voto

McDowell Points 62645

System.console() retourne null s'il n'y a pas de console.

Vous pouvez contourner cela en ajoutant une couche d'indirection à votre code ou en exécutant le code dans une console externe et en attachant un débogueur à distance.

0 votes

Cela m'a également renvoyé null dans PowerShell lorsque j'exécutais quelque chose comme java -cp ... Class | tee out.

9voto

MonkeyPaperwork Points 11

J'ai également rencontré ce problème en essayant d'écrire une application en ligne de commande simple.

Une autre alternative à la création de votre propre objet BufferedReader à partir de System.in est d'utiliser java.util.Scanner comme ceci :

import java.util.Scanner;

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

String s = in.nextLine();

Bien sûr, cela ne remplacera pas Console directement, mais vous donnera accès à une variété de différentes fonctions d'entrée.

Voici plus de documentation sur Scanner chez Oracle.

7voto

Vincent Ramdhanie Points 46265

Selon les docs :

Si la machine virtuelle est démarrée automatiquement, par exemple par un planificateur de tâches en arrière-plan, elle n'aura généralement pas de console.

1 votes

Cette réponse m'a mené à découvrir que si vous exécutez Gradle avec le démon activé, vous ne pourrez pas obtenir de console dans vos tâches Gradle. Exécuter ma tâche Gradle avec ' --no-daemon' permet l'accès à la console.

0 votes

Cela m'est arrivé en utilisant Drip (github.com/ninjudd/drip) pour un outil en ligne de commande. Oops!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X