2012-05-15 31 views
18

tengo algo como esto:¿Cómo puedo borrar el búfer del escáner en Java?

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      System.out.println("Invalid input. Please try again."); 
      System.out.println(); 
     } 
     // Clear buffer 
    } 
    System.out.print(rounds+" rounds."); 

¿Cómo puedo borrar el búfer?

Edición: He intentado lo siguiente, pero no funciona por alguna razón:

while(in.hasNext()) 
    in.next(); 
+0

¿Qué quiere decir con "Borrar búfer"? borrar la consola (como el comando cls dos)? –

+1

Estoy buscando algo en la línea de: 'while (in.hasNext()) in.next();'. Por alguna razón ese bucle no funciona. –

Respuesta

6

No se puede eliminar explícitamente el búfer del escáner. Internamente, puede borrar el búfer después de leer un token, pero ese es un detalle de implementación fuera del alcance de los programadores.

23

Prueba esto:

in.nextLine(); 

Esto hace avanzar el escáner a la siguiente línea.

+3

A veces hay varias líneas ingresadas, esto solo funciona para una línea. –

+2

Hazlo para tantas líneas ingresadas. – m0skit0

+0

Se podría pensar que se podría usar la línea de la línea siguiente (o hasNext) para verificar si hay más entradas disponibles, pero esto no funciona en Java. Los métodos hasNextLine/hasNext siempre devuelven verdadero para el teclado (System.in). La única forma que he encontrado para borrar todos los datos almacenados en el búfer sin bloquear es abrir un nuevo escáner: in.close(); in = new Scanner (System.in); – Georgie

0

Inserte la línea

in.nextLine(); 
5

Esto debería solucionarlo ...

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      System.out.println("Invalid input. Please try again."); 
      in.next(); // -->important 
      System.out.println(); 
     } 
     // Clear buffer 
    } 
    System.out.print(rounds+" rounds."); 
5

Utilice el siguiente comando:

in.nextLine(); 

justo después

System.out.println("Invalid input. Please Try Again."); 
System.out.println(); 

o después del siguiente corchete (donde está tu comentario al respecto).

Este comando avanza el escáner a la siguiente línea (cuando se lee desde un archivo o una cadena, esto simplemente lee la siguiente línea), por lo tanto, básicamente se vacía, en este caso. Borra el búfer y prepara el escáner para una nueva entrada. Se puede utilizar, preferiblemente, para borrar el búfer en uso cuando un usuario ha ingresado una entrada inválida (como una letra cuando se le pide un número).

Documentación del método se puede encontrar aquí: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

Espero que esto ayude!

0

probar este código:

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      in.NextLine(); // to clear Scanner 
     //You can throw new InputMismatchException(); 
      System.out.println("Invalid input. Please try again."); 
      System.out.println(); 
     } 

    } 
    System.out.print(rounds+" rounds."); 
0

Una solución es colocar el objeto de banco dentro del bucle do-while en el principal, de modo que se crea un nuevo objeto de banco cada vez.

Sin embargo, esto presenta ciertos problemas, a saber, la matriz de cuentas y la variable de recuento. Puede solucionar esto colocándolos en bankUser.

static int count = 0; //don't forget to make count global and initialize 
public static void main(String[] args) { 


    int Choice; 
    //place the Acct array inside bankUser main or declare 
    //as global 
    bankAcct myAcct[] = new bankAcct[3]; 

    do 
    { //Place the bank object inside the do-while 
    Bank myBank = new Bank(count, myAcct); //pass the variables to the 
              //new Bank object 
    dispMenu(); 

    Choice = getChoice(); 

    proChoice(Choice, myBank); 

    } 
    while (Choice !=0); 
    } 

No se olvide de hacer el recuento global, ya que tiene que ser capaz de ser aprobada en el objeto en el principal y se incrementa por el switch de los casos openAcct en el método ProChoice.

case 1: myBank.openAcct(); 
    count++; 
    break; 

Finalmente puede pasar la matriz myAcct y la variable de conteo a través del objeto usando un constructor en la clase del banco.

public Bank(int count, bankAcct myAcct[]) { 
this.count = count; 
this.myAcct = myAcct; 

}

Cuestiones relacionadas