2013-04-12 7 views
6

Ten fragment kodu ma uzyskać liczbę całkowitą od użytkownika, a następnie zakończyć program. Jeśli użytkownik wprowadzi nieprawidłowy numer, ponownie pyta użytkownika.Scanner.reset() nie działa

Po wybraniu wyjątku używa Scanner.reset() do resetowania skanera, ale nie działa. i ponownie rzuca poprzedni wyjątek.

Scanner in = new Scanner(System.in); 
while (true) { 
    try { 
     System.out.print("Enter an integer number: "); 
     long i = in.nextLong(); 
     System.out.print("Thanks, you entered: "); 
     System.out.println(i); 
     break; 
    } catch (InputMismatchException ex) { 
     System.out.println("Error in your input"); 
     in.reset(); // <----------------------------- [The reset is here] 
    } 
} 

Myślałem Scanner.reset() kasuje wszystko i zapomnieć o wyjątek. Położyłem to przed pytaniem użytkownika o nowe wejście.

Jeśli źle zrozumiałem, jaka jest właściwa droga?

+2

Co sądzisz 'Scanner.reset()' robi? Przeczytaj dokumentację API dla tej metody. – Jesper

+0

Co próbujesz zrobić z 'reset()'? Czy próbujesz ponownie poprosić o dane wejściowe użytkownika? Nie to robi 'reset()'. –

Odpowiedz

11

Źle zrozumiałeś cel metody reset: jest tam, aby zresetować "metadane" związane ze skanerem - jego białe znaki, znaki ograniczające i tak dalej. Nie zmienia stanu jego wejścia, więc nie osiągnie tego, czego szukasz.

Co trzeba to wezwanie next(), który odczytuje i odrzuca jakąkolwiek String z Scanner:

try { 
    System.out.print("Enter an integer number: "); 
    long i = in.nextLong(); 
    System.out.print("Thanks, you entered: "); 
    System.out.println(i); 
    break; 
} catch (InputMismatchException ex) { 
    System.out.println("Error in your input"); 
    in.next(); // Read and discard whatever string the user has entered 
} 

polegając na wyjątki złapać wyjątkowych sytuacjach jest OK, ale jeszcze lepsze podejście do samej kwestii używać has... metod przed wywołaniem metody next... coś takiego:

System.out.print("Enter an integer number: "); 
if (!in.hasNextLong()) { 
    in.next(); 
    continue; 
} 
long i = in.nextLong(); 
System.out.print("Thanks, you entered: "); 
System.out.println(i); 
break; 
3

Na Scanner.reset() javadoc, metoda tylko "resetuje" ustawienia ustawień narodowych, podstawników i ograniczników. Nie robi nic z danymi, które już przeczytał.