2010-03-10 19 views
6

Jako ćwiczenie na kurs języka Java w Uni dziś rano musiałem napisać mały program, aby poprosić użytkownika o wprowadzenie pewnych szczegółów, a następnie wydrukować je. Od tego czasu skończyłem pisać, ale po drodze natknąłem się na dziwny problem.Dlaczego linia 17 tego programu Java nie jest wykonywana?

Zobacz poniższy kod:

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

Gdy ten program działa, linia 17 (patrz komentarze) są pomijane; Account name: jest drukowany, ale użytkownik nie ma możliwości wprowadzenia informacji, tak jakby ten wiersz kodu został skomentowany. Żadne błędy nie są zgłaszane. Wyjście wygląda następująco: ID

konta:
nazwa konta:
bilans konta:

Jeśli jednak przełączyć linie 13 i 14 z 16 i 17, jak równie następuje, program działa poprawnie, a żadne wiersze nie są pomijane.

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

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

Dlaczego linia 17 jest pomijana w pierwszym przypadku, ale nie druga?

Jeśli jest to istotne, używam aktualizacji JDK 6 Update 18 oraz TextPad 5.3.1.

Odpowiedz

5

Spojrzenie na javadoc powinno pokazać, dlaczego.

Scanner.nextLine() przeskakuje na koniec bieżącego wiersza i zwraca to, co zostało pominięte. Ponieważ użytkownik wprowadził już pewne dane, funkcja ta zwróci to, co pozostanie w strumieniu wejściowym. Kiedy zmienisz kolejność, nie ma jeszcze żadnych danych wejściowych, dlatego widzisz prośbę o wprowadzenie.

Ważną część:

Ta metoda zwraca resztę bieżącego wiersza, z wyłączeniem jakiejkolwiek separator linii na końcu.

+1

Dzięki, że to wyczyści. Powinienem był odnieść się do dokumentacji. – Auguste

+0

@Auguste żyjesz i się uczysz! +1 za próbowanie odrabiania zadań domowych i zadawanie rozsądnych pytań! – Kiril

5

NextInt() po prostu zużywa wartość całkowitą. Gdy metoda jest pewna, że ​​wprowadzane wejście jest całkowitą liczbą, kończy się bez spożywania znaków wygenerowanych przez naciśnięcie klawisza powrotu. Po wywołaniu NextLine() widzi znaki powrotu w buforze i natychmiast zwraca ciąg o zerowej długości.

Do radzenia sobie z tym polecam zawsze używać NextLine(). Użytkownicy linii poleceń są bardzo przyzwyczajeni do klucza powrotnego będącego kluczem "wprowadź wartość". Analizuj wyniki NextLine() jako liczbę całkowitą za pomocą Integer.valueOf(result).

1

Od this thread:

Powodem daje problem jest, bo gdy użytkownik wprowadzi liczbę całkowitą następnie wciśnie ENTER, dwie rzeczy, które właśnie zostały wprowadzone: liczba całkowita i „nowej linii”, która jest \n .
Metoda, którą wywołujesz, "nextInt", odczytuje tylko w liczbie całkowitej, co pozostawia znak nowej linii w strumieniu wejściowym.
Jednak dzwonienie pod numer nextLine() powoduje odczytanie znaków nowej linii, dlatego przed wykonaniem kodu konieczne było wywołanie nextLine().
Mogłeś również nazwać next(), który również zostałby odczytany w linii nowej.

0

Scanner.nextInt łapie pierwsze wystąpienie liczby całkowitej i nic innego, więc nie ma obsługiwać nowy charakter liniowy, który Scanner.readLine będzie widzieć jak jego wejścia. Możesz dodać Scanner.next() pomiędzy, które pochłoną nowy znak linii, ale to rozwiązanie ma swoje wady.

Moim rozwiązaniem byłoby odczytanie wszystkich danych wprowadzonych przez użytkownika za pomocą Scanner.readLine i przeanalizowanie pożądanych wyników z napisów.

Powiązane problemy