2010-03-10 10 views
6

Als eine Übung für meinen Java-Kurs in Uni heute Morgen, musste ich ein kleines Programm schreiben, um den Benutzer zu bitten, einige Details einzugeben, und sie dann zurück zu drucken. Ich habe es inzwischen fertig geschrieben, aber ich hatte ein seltsames Problem auf dem Weg.Warum wird Zeile 17 dieses Java-Programms nicht ausgeführt?

den Code Siehe unten:

import java.util.Scanner; 

public class Scanner_Exercise 
{ 
    public static void main (String[] args) 
    { 
     Scanner keyboardIn = new Scanner(System.in); 

     int accountId; 
     String accountName; 
     float accountBalance; 

     System.out.println("Account ID: "); //Line 13 
     accountId = keyboardIn.nextInt(); //Line 14 

     System.out.println("Account name: "); //Line 16 
     accountName = keyboardIn.nextLine(); //Line 17 

     System.out.println("Account balance: "); 
     accountBalance = keyboardIn.nextFloat(); 
    } 
} 

Wenn dieses Programm läuft, Zeile 17 (Kommentare beziehen) übersprungen wird; Account name: wird gedruckt, aber der Benutzer hat keine Möglichkeit, die Informationen einzugeben, als ob diese Codezeile auskommentiert wäre. Es werden keine Fehler ausgelöst. Die Ausgabe sieht wie folgt aus:

Konto-ID:
Kontoname:
Kontostand:

Allerdings, wenn ich wechseln Linien 13 und 14 mit 16 und 17, wie als folgt, das Programm läuft gut, und keine Zeilen werden übersprungen.

System.out.println("Account name: "); //Line 16 
accountName = keyboardIn.nextLine(); //Line 17 

System.out.println("Account ID: "); //Line 13 
accountId = keyboardIn.nextInt(); //Line 14 

Warum wird im ersten Fall die Zeile 17 übersprungen, aber nicht die zweite?

Wenn es irgendwie relevant ist, verwende ich JDK 6 Update 18 und TextPad 5.3.1.

Antwort

5

Ein Blick auf die javadoc sollte Ihnen zeigen, warum.

Scanner.nextLine() springt an das Ende der aktuellen Zeile und gibt zurück, was es übersprungen hat. Da der Benutzer bereits einige Daten eingegeben hat, gibt diese Funktion das zurück, was im Eingabestrom noch übrig ist. Wenn Sie den Auftrag umschalten, hat er noch keine Eingabe, weshalb Sie nach Eingabe fragen.

Der wichtige Teil:

Dieses Verfahren den Rest der aktuellen Zeile zurückkehrt, ohne jede Zeilentrenn am Ende.

+1

Danke, das macht es klar. Ich hätte in erster Linie auf die Dokumentation verweisen sollen. – Auguste

+0

@Auguste du lebst und du lernst! +1 für den Versuch, deine Hausaufgaben zu machen und eine vernünftige Frage zu stellen! – Kiril

5

NextInt() verbraucht lediglich den ganzzahligen Wert. Sobald die Methode sicher ist, dass die Eingabe, die eingegeben wird, eine vollständige Nummer ist, wird sie beendet, ohne die Zeichen zu verbrauchen, die durch Drücken der Eingabetaste erzeugt wurden. Wenn Sie NextLine() aufrufen, sieht es die Rückkehrzeichen in dem Puffer und gibt sofort eine Null-Länge-Zeichenfolge zurück.

Um damit umzugehen, empfehle ich Ihnen immer NextLine() zu verwenden. Befehlszeilenbenutzer sind sehr daran gewöhnt, dass der Rückgabeschlüssel der Schlüssel "Wert eingeben" ist. Analysieren Sie die Ergebnisse von NextLine() als Ganzzahl, indem Sie Integer.valueOf(result) verwenden.

1

Von this thread:

Der Grund ist es Ihnen Mühe gibt, weil, wenn der Benutzer eine ganze Zahl tritt dann eingeben Treffer, zwei Dinge sind gerade eingegeben worden: die ganze Zahl und eine „Neue-Zeile“, die \n ist .
Die von Ihnen aufgerufene Methode "nextInt" liest nur die Ganzzahl ein, die den Zeilenumbruch im Eingabestream zurücklässt.
Aber Aufruf nextLine() liest in Newlines, weshalb Sie nextLine() aufrufen mussten, bevor Ihr Code funktionieren würde.
Sie könnten auch next() aufgerufen haben, die auch in der Newline gelesen hätte.

0

Scanner.nextInt fängt das erste ganze Auftreten und sonst nichts, so dass es nicht die neuen Zeilen Zeichen handhaben, die Scanner.readLine als seine Eingabe sehen. Sie könnten eine Scanner.next() hinzufügen, zwischen der das neue Zeilenzeichen verbraucht würde, aber diese Lösung hat ihre eigenen Nachteile.

Meine Lösung wäre, alle Benutzereingaben mit Scanner.readLine zu lesen und die gewünschten Ergebnisse aus den Strings zu analysieren.

Verwandte Themen