2011-06-16 7 views
2
import java.util.*; 

public class June16{ 
    public static void main(String[] args){ 
     Scanner kb = new Scanner(System.in); 
     double b=0; 
      boolean checkInput = true; 
     do{ 
      try{ 
       System.out.println("Input b : "); 
       b = kb.nextDouble(); 
       checkInput = false; 
      }catch(InputMismatchException ime){ 
      } 
     }while(checkInput); 
    } 
} 

Après avoir lancé InputMismatchException, pourquoi mon programme ne vous invite pas à entrer? : Djava.util.Scanner: pourquoi mon nextDouble() ne demande pas?

Répondre

4

De l'documentation:

Lorsqu'un scanner jette un InputMismatchException, le scanner ne passera pas le jeton causé l'exception, de sorte qu'il peut être récupéré ou s kipped via une autre méthode.

C'est pourquoi vous vous retrouvez dans une boucle infinie si vous n'entrez pas un double valide. Lorsque vous gérez l'exception, passez au jeton suivant avec kb.next().

2

Parce que si le Scanner.nextDouble() échoue, il laisse le jeton dans la file d'attente, (qui est ensuite relu et à nouveau provoquant l'échec à maintes reprises).

les opérations suivantes:

try { 
    // ... 
} catch (InputMismatchException ime) { 
    kb.next(); // eat the malformed token. 

}

ideone.com demo illustrating working example

+0

file d'attente 15 caractères aller ici – Woot4Moo

1

Ceci est dû au fait que nextDouble prendra le nombre décimal que vous avez entré, mais il y a toujours un retour chariot que vous avez entré et qui n'a pas été lu par le scanner. La prochaine fois qu'il boucle, il lit l'entrée, mais attendez! il y a un retour en calèche, donc ... pas besoin de scanner quoi que ce soit. Il ne fait que traiter le retour chariot. Bien sûr, le programme trouve que ce n'est pas un double, donc vous obtenez une exception. Comment le réparer? Eh bien, ayez quelque chose qui balaie tous les restes qui ont été laissés par le doubleDouble (à savoir un prochain()) et ensuite scannez le double suivant à nouveau.