web-dev-qa-db-fra.com

System.console () renvoie null

J'utilisais readLine sur BufferedReader pour obtenir l'entrée/le nouveau mot de passe de l'utilisateur, mais je voulais masquer le mot de passe; j'essaie donc d'utiliser la classe Java.io.Console. Le problème est que System.console() renvoie null quand une application est déboguée dans Eclipse. Je suis nouveau sur Java et Eclipse ne savent pas si c’est la meilleure façon de le faire. Je clique avec le bouton droit sur le fichier source et je sélectionne "Débogage en tant que>>" Application Java ". Existe-t-il une solution de contournement? ?

76
Gauls

Ceci est un bug n ° 122429 sur Eclipse

35
swimmingfisher

Cet extrait 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 du test dans Eclipse, la saisie de votre mot de passe sera affichée en clair. Au moins, vous pourrez tester. Il suffit de ne pas entrer votre vrai mot de passe lors des tests. Conservez-le pour une utilisation en production;).

32
formixian

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

Vous pouvez contourner ce problème soit par en ajoutant une couche d'indirection à votre code ou en exécutant le code dans une console externe et par en joignant un débogueur distant .

13
McDowell

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

Une autre alternative à la création de votre propre objet BufferedReader à partir de System.in consiste à utiliser Java.util.Scanner comme suit:

import Java.util.Scanner;

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

String s = in.nextLine();

Bien entendu, cela ne constituera pas un remplacement immédiat de la console, mais vous donnera accès à diverses fonctions d’entrée.

Voici plus de documentation sur Scanner d'Oracle .

8
MonkeyPaperwork

Selon le API :

"I Si la machine virtuelle est démarrée à partir d'une ligne de commande interactive sans rediriger les flux d'entrée et de sortie standard, sa console existera et sera généralement connectée au clavier et à l'affichage à partir duquel la machine virtuelle Si la machine virtuelle est démarrée automatiquement, par exemple par un planificateur de tâches en arrière-plan, elle ne disposera généralement pas d'une console. "

6
Emad Aghayi

Selon le docs :

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

6
Vincent Ramdhanie

Vous avez ce message d'erreur lors de l'exécution de l'application à partir de Netbeans. À en juger par les autres réponses, il semble que cela se produise lorsque vous exécutez votre application à partir d'un IDE. Si vous jetez un oeil à cette question: Essayer de lire à partir de la console en Java , c'est parce que

La plupart des IDE utilisent javaw.exe au lieu de Java.exe pour exécuter Java code

La solution consiste à utiliser le command line/terminal pour obtenir le Console.

2
ojonugwa ochalifu

Je crois que dans les configurations d'exécution d'Eclipse, vous pouvez configurer l'affectation ou non d'une console - assurez-vous que cette case est cochée. (Cela fait longtemps que je n'ai pas utilisé Eclipse, je crains donc de ne pas donner d'instructions précises).

Si cela ne fonctionne pas, alors quelque chose qui assurera ce travail démarrera votre application en mode débogage, puis connectez-vous au processus avec Eclipse. Recherchez "Débogage à distance Eclipse" si vous ne savez pas comment procéder.

De plus, en général, il est déconseillé d’attribuer obliger une console, car cela influe beaucoup sur la flexibilité de votre application - comme vous venez de le découvrir. De nombreuses façons d’appeler Java n’attribueront pas de console et votre application est inutilisable dans ces cas (ce qui est mauvais). Peut-être pourriez-vous également autoriser la spécification d’arguments sur la ligne de commande. (Si vous testez assez précisément l’entrée de la console, mais il serait peut-être utile que les utilisateurs puissent invoquer votre application à partir de scripts et/ou de serveurs sans interface graphique, de sorte que ce type de conception flexible est presque toujours une bonne idée. conduit souvent à un code mieux organisé, aussi.)

1
Andrzej Doyle

C'est vrai.

Vous devrez exécuter l'application en dehors d'Eclipse. Examinez les panneaux de configuration du programme de lancement dans Eclipse et voyez si vous pouvez repérer l’option indiquant d’exécuter la commande dans une machine virtuelle Java distincte.

0
Stephen C