Comment utiliser java.util.Scanner pour lire correctement la saisie de l'utilisateur du Système.et agir sur elle?

Ce qui est censé être une canonique question/réponse qui peut être utilisé comme un
double cible. Ces exigences sont basées sur les plus communs
questions publiées tous les jours et peuvent être ajoutés au besoin. Ils ont tous
exiger le même code de base de structure pour obtenir pour chacun des scénarios
et ils sont généralement dépendants l'un de l'autre.


Scanner semble comme un "simple" classe à utiliser, et c'est là la première erreur est faite. Il n'est pas simple, il a toutes sortes de la non-évidence d'effets secondaires et aberrante des comportements qui enfreignent les Principe de moindre Étonnement de façon très subtile.

Si cela peut sembler exagéré pour cette classe, mais l'éplucher les oignons, les erreurs et les problèmes sont tous simple, mais pris ensemble, ils sont très complexe en raison de leurs interactions et effets secondaires. C'est pourquoi il ya beaucoup de questions à ce sujet sur un Débordement de Pile tous les jours.

Commune Scanner questions:

Plus Scanner questions comprennent des tentatives ont échoué à plus d'une de ces choses.

  1. Je veux être en mesure d'avoir mon programme automatiquement d'attendre la prochaine entrée après chaque saisie précédente.
  2. Je veux savoir comment faire pour détecter une sortie commande et à la fin de mon programme lorsque cette commande est entrée.
  3. Je veux savoir comment faire pour correspondre à de multiples commandes pour la sortie de commande dans une casse.
  4. Je veux être en mesure de faire correspondre les modèles d'expression régulière ainsi que le haut-primitives. Comment, par exemple, pour correspondre à ce qui semble être une date ( 2014/10/18 )?
  5. Je veux savoir comment faire correspondre les choses qui pourraient ne pas être facilement mises en œuvre avec l'expression régulière correspondant - par exemple, une URL ( http://google.com ).

Motivation:

Dans le monde Java, Scanner est un cas particulier, il est extrêmement pointilleux de la classe que les enseignants ne devraient pas donner de nouveaux étudiants instructions d'utilisation. Dans la plupart des cas, les instructeurs ne sais même pas comment l'utiliser correctement. C'est à peine si jamais utilisée dans la production professionnelle de code pour que sa valeur pour les étudiants est extrêmement discutable.

À l'aide de Scanner implique toutes les autres choses de cette question et de la réponse mentionne. Il n'est jamais sur Scanner c'est sur la façon de résoudre ces problèmes communs avec Scanner qui sont toujours co-morbides des problèmes dans presque toutes la question qui se Scanner mal. Il n'est jamais sur next() et nextLine(), qui n'est qu'un symptôme de la finickiness de la mise en œuvre de la classe, il y a toujours d'autres questions dans le code de poster des questions à poser à propos de Scanner.

La réponse montre de manière complète, idiomatiques de la mise en œuvre de 99% des cas où Scanner est utilisé et demandé à ce sujet sur StackOverflow.

Surtout en débutant le code. Si vous pensez que cette réponse est trop complexe ensuite se plaindre pour les instructeurs qui racontent des nouveaux étudiants à l'utilisation Scanner avant d'expliquer les subtilités, les caprices, la non-évidence d'effets secondaires et les particularités de son comportement.

Scanner est un grand moment d'enseignement sur l'importance de la Principe de moindre étonnement est et pourquoi la cohérence du comportement et de la sémantique sont importants dans le nommage des méthodes et des arguments de méthode.

Note aux étudiants:

Vous aurez probablement jamais voir Scanner utilisé dans
professionnel/commercial en ligne d'applications d'entreprise, parce que tout ce qu'il
n'est mieux fait par quelque chose d'autre. Monde réel, le logiciel doit être
plus résistant et plus facile à gérer que Scanner vous permet d'écrire
code. Monde réel logiciel utilise le format de fichier normalisé d'analyseurs et de
documenté les formats de fichier, pas le adhoc formats d'entrée que vous êtes
donné en stand alone affectations.

OriginalL'auteur | 2014-10-19