1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

hasNext() wartet auf Eingabe

  • elundril
  • 17. November 2008 um 23:07
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • elundril
    Punkte
    45
    Beiträge
    7
    • 17. November 2008 um 23:07
    • #1

    Hallo,

    ich hab folgendes Problem: ich frag bei einem Scannerobjekt mit hasNext() ab ob noch was ausgelesen werden kann. Aber anstatt das Java false liefert wenn kein Zeichen mehr da ist, wartet mein Programm einfach bis eine eingabe getätigt wurde. Anders gesagt, solange bis hasNext() true ist. Damit wäre aber das hasNext() ad absurdum geführt und hätte keinen Sinn. Kann man mir sagen was ich falsch mach, bzw. wie man das lösen könnte?

    lg elundril

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 17. November 2008 um 23:29
    • #2

    Das ist gar nicht ad absurdum geführt, aber wenn das Programm auf einer Konsole läuft, kann es ja nie wissen, ob noch was kommt, daher muss es warten.

    Wenn du es beenden willst, musst du ein EOF schicken (üblicherweise Ctrl-D unter Unix und Ctrl-Z unter Windows). Oder du schickst mittels Pipe ein File in den Standardinput deines Programms hinein. Dann ist es einfach aus, wenn das File aus ist.

  • elundril
    Punkte
    45
    Beiträge
    7
    • 18. November 2008 um 09:53
    • #3

    Danke! Funktioniert jetzt reibungslos!

    Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

  • java-girl
    Punkte
    2.037
    Beiträge
    357
    • 18. November 2008 um 10:15
    • #4
    Zitat von elundril

    Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Nein, ist vollkommen wurscht. Normalerweise wartet man bei der Konsole auf '\n' und bricht dann ab. Stell dir einfach den Zeilenumbruch als Delimiter ein dann müsste der Scanner eh aufhören.

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 18. November 2008 um 15:52
    • #5
    Zitat von elundril

    denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Welcher Benutzer macht Eingaben händisch auf der Konsole? Nachdem man die Sache ja meistens nicht nur einmal macht, verwendet man soundso immer ein File.

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 18. November 2008 um 15:53
    • #6
    Zitat von java-girl

    Nein, ist vollkommen wurscht. Normalerweise wartet man bei der Konsole auf '\n' und bricht dann ab. Stell dir einfach den Zeilenumbruch als Delimiter ein dann müsste der Scanner eh aufhören.


    Im Allgemeinen nicht.

  • java-girl
    Punkte
    2.037
    Beiträge
    357
    • 18. November 2008 um 16:36
    • #7
    Zitat von Ringding

    Im Allgemeinen nicht.

    Im Allgemeinen WAS nicht?

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 18. November 2008 um 16:52
    • #8

    Der Scanner hört nicht bei EOL auf.

  • java-girl
    Punkte
    2.037
    Beiträge
    357
    • 18. November 2008 um 18:08
    • #9
    Zitat von Ringding

    Der Scanner hört nicht bei EOL auf.

    Ich dachte, man kann beim Scanner den Delimiter festlegen.

  • a9bejo
    Punkte
    4.697
    Beiträge
    913
    • 18. November 2008 um 18:24
    • #10
    Zitat von elundril


    Das heißt die Scannerklasse dient eigentlich nur zum Einlesen von Files, oder? denn welcher Benutzer gibt nach jeder eingabe ein EOF ein (Bei Konsolenanwendungen)?

    Nein, der Scanner liest jede Art von Stream, zum Beispiel von einem Netzwerk, einer Datenbank, oder einem Marsroboter. Der "Benutzer", also die Instanz, die den Stream mit Daten füttert, ist meistens ein Computerprogramm, das dann auch das EOF mitschickt.

    Du hast aber Recht, das es eher unueblich ist, die Daten über die Kommandozeile interaktiv, also über einen "Dialog mit dem Computer", einzulesen. Viel öfter kommt es zum Beispiel vor, dass der Standard Input Stream ("System.in") mit einem Filestream gefüttert wird, der dann am Ende automatisch ein EOF schickt. Zum Beispiel:

    Code
    $ echo "Das sind vier Woerter" | wc -w
    4


    Zitat von java-girl

    Normalerweise wartet man bei der Konsole auf '\n' und bricht dann ab.


    Fuer diesen Fall sind vermutlich die Methoden Scanner#hasNextLine() bzw Scanner#nextLine() besser geeignet, denn die arbeiten plattformunabhängig, mit System.getProperty('line.separator') als Delemiter. '\n' ist ja nicht zwingend das Zeichen für einen Zeilenumbruch.

    6 Mal editiert, zuletzt von a9bejo (19. November 2008 um 09:06)

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 19. November 2008 um 09:43
    • #11
    Zitat von a9bejo

    Fuer diesen Fall sind vermutlich die Methoden Scanner#hasNextLine() bzw Scanner#nextLine() besser geeignet, denn die arbeiten plattformunabhängig, mit System.getProperty('line.separator') als Delemiter. '\n' ist ja nicht zwingend das Zeichen für einen Zeilenumbruch.

    Das soundso.

    java-girl meinte anscheinend, dass der Scanner bei \n ein Token liefert (also wenn man auf der Konsole Enter drückt). Ja, tut er üblicherweise. Aber von "abbrechen" kann keine Rede sein. Du kannst ja auch noch mehr Zeilen eintippen wollen.

  • java-girl
    Punkte
    2.037
    Beiträge
    357
    • 19. November 2008 um 13:26
    • #12
    Zitat von Ringding

    java-girl meinte anscheinend, dass der Scanner bei \n ein Token liefert (also wenn man auf der Konsole Enter drückt). Ja, tut er üblicherweise. Aber von "abbrechen" kann keine Rede sein. Du kannst ja auch noch mehr Zeilen eintippen wollen.

    Nein, du hast mich wohl falsch verstanden. Ich meinte, dass man wenn man von der Konsole liest und den Scanner verwendet und nur eine oder eine bestimmte Anzahl von Zeilen lesen will abbricht. Beim Scanner kann man scheinbar als "End"-Delimiter scheinbar nichts einstellen ist mir jetzt aufgefallen, aber bei anderen StreamReadern geht das wenn ich mich recht erinnere. Die hören dann von selbst auf.

  • HereBeDragons
    Punkte
    15
    Beiträge
    2
    • 23. November 2008 um 16:40
    • #13

    Man kann ein Abbrechen bei Zeilenende auch ganz leicht folgendermaßen bewerkstelligen:

    Code
    Scanner s = new Scanner(System.in);
    s = new Scanner(s.nextLine());

    Nun hat man lediglich eine Zeile als Stream.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum