Ich verwendete readLine
von BufferedReader
, um Eingabe/neues Kennwort vom Benutzer zu erhalten, aber wollte das Kennwort maskieren, also versuche ich java.io.Console
Klasse zu verwenden. Problem ist, dass System.console()
null
zurückgibt, wenn eine Anwendung in Eclipse debuggt wird. Ich bin neu in Java und Eclipse nicht sicher, ist dies der beste Weg, um zu erreichen? Ich klicke mit der rechten Maustaste auf die Quelldatei und wähle "Debug As"> "Java Application". Gibt es eine Problemumgehung?System.console() gibt null zurück
Antwort
Das stimmt.
Sie müssen die Anwendung außerhalb von Eclipse ausführen. Sehen Sie sich die Launcher-Konfigurationsfenster in Eclipse an und prüfen Sie, ob Sie die Option zum Ausführen des Befehls in einer separaten JVM erkennen können.
Ich glaube, dass in den Ausführungskonfigurationen für Eclipse können Sie konfigurieren, ob eine Konsole zuweisen oder nicht - sicher, dass dies überprüft wird. (Es ist eine Weile her, dass ich Eclipse benutzt habe, deshalb kann ich keine spezifischen Anweisungen geben, fürchte ich).
Wenn das nicht funktioniert, dann starten Sie Ihre Anwendung im Debug-Modus und verbinden sich dann mit dem Prozess mit Eclipse. Suchen Sie nach "eclipse remote debugging", wenn Sie nicht sicher sind, wie das geht.
Darüber hinaus ist es im Allgemeinen eine schlechte Idee, erfordern eine Konsole zugewiesen werden, da dies sehr viel Einfluss auf die Flexibilität Ihrer Anwendung - wie Sie gerade entdeckt haben. Viele Möglichkeiten zum Aufrufen von Java werden keine Konsole zuweisen, und Ihre Anwendung ist in diesen Fällen unbrauchbar (was schlecht ist). Vielleicht könnten Sie alternativ zulassen, dass Argumente in der Befehlszeile angegeben werden. (Wenn Sie die Konsoleneingaben speziell testen, dann ist das fair genug, aber es wäre möglicherweise nützlich, dass Benutzer Ihre Anwendung von Skripts und/oder Headless-Servern aus aufrufen können. Daher ist diese Art von flexiblem Design fast immer eine gute Idee . es führt oft zu besser organisierten Code auch)
Ja, es ist nur für meinen Debug-Zweck, Benutzer erhalten Shell-Skript oder Bat-Datei. Ist es nicht gud, die Konsole zu benutzen? Wenn ja, was ist der bessere Weg – Gauls
BTW alle Remote-Debugging-Suche spricht ab Web-Server, aber ich bin nicht eine Web-Anwendung erstellen. Das ist ein einfaches Java. könnte eine bessere Möglichkeit sein, das Passwort zu maskieren? – Gauls
Sie können jeden Java-Prozess remote debuggen, fügen Sie einfach z. '-Xdebug -Xrunjdwp: Transport = dt_socket, Server = y, Suspend = n, Adresse = 8000' an die Argumente der VM (mindestens auf Sun JVMs). Die Verwendung der Konsole kann in Ordnung sein, aber wie gesagt, bedeutet, dass Ihr Code einfach * nicht funktioniert * wenn er ohne einen gestartet wird. Betrachten Sie stattdessen die Übergabe von Werten, die direkt von Befehlszeilenargumenten, Systemeigenschaften, Eigenschaftendateien usw. stammen. Stellen Sie zumindest eine Alternative bereit - z. Gehen Sie nur zur Konsole, wenn ein Wert * nicht als Befehlszeilenargument angegeben wurde. –
nach dem docs.
Wenn die virtuellen Maschine automatisch gestartet wird, zum Beispiel durch einen Scheduler Hintergrund-Job, es wird dann in der Regel nicht hat eine Konsole.
Diese Antwort führte mich zu der Feststellung, dass wenn Sie Gradle mit aktiviertem Deamon ausführen, Sie keine Konsole in Ihren Gradle-Aufgaben erhalten können. Wenn ich meine Gradle-Aufgabe mit dem "--no-daemon" ausführe, kann der Zugriff auf die Konsole erfolgen. – whitespy9
Das ist mir passiert, wenn ich Tropf (https://github.com/ninjudd/drip) für ein Befehlszeilenwerkzeug verwende. Hoppla! –
System.console()
gibt null zurück, wenn keine Konsole vorhanden ist.
Sie können dies umgehen entweder adding a layer of indirection to your code oder durch Ausführen des Codes in einer externen Konsole und attaching a remote debugger.
Es gab auch null in PowerShell für mich zurück, wenn etwas wie 'java -cp ... Class | abschlagen. –
hinzufügen -console in Ihrem Programm Argumente OSGi-Konsole
Kannst du bitte mehr darüber klären wenn möglich ein Beispiel? – Gauls
Dies ist eine bug #122429 von Eclipse
Dieser Code-Schnipsel, den Trick tun sollten, starten:
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();
}
Während des Tests in Eclipse , Ihre Passworteingabe wird in clear angezeigt. Zumindest werden Sie in der Lage sein zu testen. Geben Sie während des Tests nicht Ihr richtiges Passwort ein. Behalte das für den Produktionseinsatz;).
Sollte Ihre handgerollte 'readLine' Methode den' BufferedReader' in einem finally (oder try-with-resources) Block schließen? –
Nein, weil das den passenden 'System.in'-Stream schließen würde und danach kein weiteres Lesen mehr möglich wäre. – formixian
Ja, es ist seltsam, dass dieser Stream geschlossen werden kann; Ich habe erwartet, dass es ein No-Op ist. –
Ich stieß auch auf dieses Problem beim Versuch, eine einfache Befehlszeilenanwendung zu schreiben.
Eine weitere Alternative zum eigenen BufferedReader-Objekt aus System.in zu schaffen, ist java.util.Scanner wie folgt zu verwenden:
import java.util.Scanner;
Scanner in;
in = new Scanner(System.in);
String s = in.nextLine();
Natürlich ist dies nicht ein Drop-in-Ersatz-Konsole sein wird, aber wird Sie haben Zugriff auf eine Vielzahl von verschiedenen Eingabefunktionen.
Nach dem API:
„I f die virtuellen Maschine von einer interaktiven Kommandozeile gestartet, um die Standard-Ein- und Ausgangsströme ohne Umleiten dann seine Konsole vorhanden ist und wird in der Regel mit der Tastatur verbunden werden, und die Anzeige, von der die virtuelle Maschine gestartet wurde. Wenn die virtuelle Maschine automatisch gestartet wird, zum Beispiel durch einen Hintergrundjob-Scheduler, dann wird sie normalerweise keine Konsole haben. "
- 1. System.Web.Security.FormsAuthentication.Encrypt gibt null zurück
- 2. SharedObject.getLocal() gibt null zurück
- 3. startActionMode gibt null zurück
- 4. Process.Start gibt null zurück
- 5. sessionFactory gibt null zurück
- 6. mapFragment.getMap() gibt null zurück
- 7. getBluetoothLeAdvertiser() gibt null zurück
- 8. App.Config gibt null zurück
- 9. Assembly.GetType gibt Null zurück
- 10. CloudBlob.DownloadToStream gibt null zurück
- 11. CFBundleDisplayName gibt 'null' zurück
- 12. avformat_alloc_context gibt null zurück
- 13. CMSampleBufferGetImageBuffer gibt null zurück
- 14. ListTweetOnUserTimeline gibt null zurück
- 15. getLayoutParams gibt null zurück?
- 16. ConfigurationManager.AppSettings - Gibt Null zurück
- 17. TextBlock.GetBindingExpression gibt NULL zurück
- 18. SqlCommand.ExecuteScalar() gibt Null zurück
- 19. NSClassFromString gibt null zurück
- 20. getActionBar gibt null zurück
- 21. ParentViewController gibt null zurück
- 22. TextView gibt Null zurück
- 23. App.config gibt null zurück
- 24. MediaRecorder.GetSurface() gibt null zurück
- 25. findLoadedClass() gibt null zurück
- 26. classloader.getSystemResourceAsStream gibt null zurück
- 27. findFragmentById gibt null zurück
- 28. HttpPostedFileBase gibt null zurück
- 29. Plus.PeopleApi.getCurrentPerson gibt null zurück
- 30. CameraUpdateFactory.newLatLngZoom gibt null zurück
Siehe auch http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083 Ich identifizierte 'System.out' und' System.in' für ausreichend sein mein Anwendungsfall und abandoned mit 'System.console()'. – OneWorld