Une histoire de malentendu sur l'utilisation du scanner Java (mémo)

table des matières

Environnement d'exécution

Java version : 12.0.1 Description du code: éditeur de texte (Atom) OS utilisé: Windows (cela fonctionnait sur Mac juste à cause du problème de code de caractère) Contexte du problème: je me suis demandé si je pouvais faire quelque chose avec ce que les débutants en Java avaient appris, et quand j'ai essayé d'écrire le code moi-même, une erreur s'est produite

Problèmes rencontrés, messages d'erreur

Le problème que j'ai prononcé est un programme qui utilise la classe Scanner et qui ne rentre que lorsqu'une touche autre qu'une touche d'entrée spécifique est entrée (dans ce cas, on m'a demandé de saisir 1 ou 2). Tout d'abord, j'ai pensé à la fonction uniquement et l'ai assemblée.

errorFile.java


Scanner sc = new Scanner().nextInt();
while(sc){
  switch(sc){
    case 1:
    //Processus 1
    break;
    case 2:
    //Processus 2
    break;
    default:
    //Processus 3
    break;
  }
}

Comme vous pouvez le voir, cela ne fonctionne pas, bien sûr. À ce stade, vous pouvez voir que nous avons fait beaucoup d'erreurs dans notre compréhension. Même si vous ne le comprenez pas, c'est plus amusant de l'essayer, et si vous faites une erreur, vérifiez-la à chaque fois et résolvez l'erreur! C'est le résultat de l'avoir assemblé avec une compréhension superficielle.

Ce qui a été mal compris

À ce stade, je vais vous expliquer ce à quoi je pensais. Si vous voulez juste voir comment résoudre les erreurs de saisie, passez simplement à la description du code. Je pense que ce sera un serpent.

Les contenus qui ont été mal compris à ce stade sont principalement les contenus suivants 〇 Je pensais que l'intérieur de () de while () était une condition de boucle → En fait, boucle jusqu'à ce que la condition entre () devienne fausse en booléen

〇 Je pensais que la classe Scanner était un formulaire avec le nom de la variable Scanner = new Scanner (). NextInt () → En fait, l'instanciation et l'acquisition des éléments d'entrée sont des fonctions distinctes. En d'autres termes, les nouveaux Scanner () et .nextInt () peuvent être séparés. En premier lieu, s'il s'agit de cette instruction, le type int sera acquis par Scanner, et une erreur supplémentaire se produira ...

〇 Je ne comprends pas la gestion des exceptions → Dans l'état actuel des choses, seule la saisie numérique est prise en charge, et si elle est saisie sous forme de chaîne de caractères, une exception se produira et il ne sera pas possible de l'exécuter correctement. La gestion des exceptions est également entrée après la résolution, mais honnêtement, l'essai est encore insuffisant pour la gestion des exceptions.

Code après résolution

Voici un code relativement propre après avoir résolu les malentendus jusqu'à présent en utilisant des questions, du matériel, des livres, etc. de grands ancêtres.

SolutionFile.java


int all = 0;
  while(all == 0){
    try{
      Scanner sc = new Scanner(System.in);
      switch(sc.nextInt()){
        case 1:
          //Processus 1
          all +=1;
          break;
        case 2:
          //Processus 2
          all +=1;
          break;
        default:
          //Processus 3
          break;
      }
    }catch(Exception e){
      //Processus 4
    } 
  }

Qu'est-ce que tu penses? À tout le moins, cela fonctionne selon mes intentions. Connaissez-vous la lisibilité, l'origine de tous les int et la gestion des exceptions de catch? J'écris du code que l'on dit être, mais si ça marche, c'est OK! Si tel est le cas, c'est convaincant. Faisons le.

Description du code

Voici une brève explication du code complété (SolutionFile.java).

Tout d'abord, si vous répertoriez chaque plage de portée (Ici, il s'écrit avec la plage du début à la fin)

while // 1
  try // 2
    Scanner // 3
    switch // 4
      case 1:
      case 2:
      default:
    switch
  try 
  catch
  catch
while

Comme ça while > try == catch > switch > case == default n'est-ce pas

// 1 À moins que vous ne quittiez pendant, le processus d'essayer d'attraper sera répété à l'infini. Dans cette condition, la valeur initiale de all est déclarée en premier et la condition est "jusqu'à ce que tout devienne autre que 0". En d'autres termes, si la valeur de tout est ajoutée ou soustraite, la boucle se terminera.

// 2 C'est un processus qui peut ensuite provoquer une erreur. La possibilité d'une erreur et le contenu que vous souhaitez normalement gérer sans erreur sont inclus dans try et l'exception est incluse dans catch. Et comme expliqué ci-dessous, catch est la partie de boucle dans while et ne sort pas de la boucle, donc après l'exécution du traitement dans catch, le traitement revient au début de while à nouveau. ..

Au fait, Je pense que si vous vous limitez au fait qu'une erreur se produit à l'origine, ce ne sera que l'entrée du scanner, mais j'ai essayé de ne déplacer que le commutateur, mais une erreur s'est produite. Voici le code pour déplacer le commutateur

Changefile.java


int all = 0;
  while(all == 0){
    try{
      Scanner sc = new Scanner(System.in);
    }catch(Exception e){
      //Processus 4
    } 
      switch(sc.nextInt()){
        case 1:
          //Processus 1
          all +=1;
          break;
        case 2:
          //Processus 2
          all +=1;
          break;
        default:
          //Processus 3
          continue;
      }
  }

Erreur:Impossible de trouver le symbole
switch(sc.nextInt()){
               ^
symbole:Variable sc

On pense que la raison est que l'élément de sc est acquis dans le commutateur.

// 3 Ici, il vous suffit de le saisir. Bien qu'il soit écrit dans la marge de ce code, import java.util.Scanner; Cette description est-elle parce qu'elle est déclarée en premier. Je ne le déclare pas plusieurs fois, donc juste ici sans déclarer l'importation Scanner sc = new java.util.Scanner(System.in); Cela ne semble pas être un problème.

// 4 Ici, le contenu d'entrée est acquis et le traitement est modifié en fonction du contenu acquis. Les expressions conditionnelles sont possibles avec l'instruction if, mais l'instruction switch est sélectionnée car elle est facile à lire et la signification du code est facile à lire. nextInt() C'est pourquoi vous demandez des chiffres. case 1: case 2: Donc, en plus de chaque processus, pour sortir de la boucle while all += 1 Ce faisant, la valeur de tout est ajoutée de 1. En conséquence, tout = 1, et en satisfaisant la condition de la boucle "jusqu'à ce que tout devienne autre que 0", la condition devient fausse et la boucle est quittée.

Et lorsque la valeur par défaut, c'est-à-dire qu'un nombre autre que 1 ou 2 est entré, le traitement est renvoyé au début de while sans changer la condition de boucle en faux en ne modifiant pas la valeur de all.

En d'autres termes, demandez-leur de le saisir plusieurs fois jusqu'à ce que 1 ou 2 soit saisi! Si vous entrez un autre nombre ou une autre chaîne, il bouclera sans fin! Voilà le processus.

Résumé

Les fonctionnalités que je souhaitais implémenter Lorsqu'une valeur autre que 1 ou 2 est entrée, demandez-la à nouveau C'est une fonction appelée.

Le point que j'ai mal compris while condition, configuration du scanner, gestion des exceptions

Et le contenu de cet article est que j'ai corrigé le malentendu et l'ai résolu. Cependant, bien que cela ait commencé à fonctionner, il y a encore beaucoup de gaspillage dans le code, il y a donc des problèmes tels que la réduction des déchets, la gestion des exceptions et la question de savoir si le code est facile à lire pour les autres, alors j'aimerais continuer à l'essayer à l'avenir. Je vais. Merci de votre collaboration.

Recommended Posts

Une histoire de malentendu sur l'utilisation du scanner Java (mémo)
Comment utiliser la classe Java Scanner (Remarque)
Histoire d'essayer de faire fonctionner le fichier JAVA
[Java] Comment utiliser Map
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
Comment utiliser les variables Java
Comment utiliser HttpClient de Java (Get)
Comment créer un conteneur Java
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Quelle est la lenteur du scanner Java?
[Traitement × Java] Comment utiliser les variables
[JavaFX] [Java8] Comment utiliser GridPane
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
[Traitement × Java] Comment utiliser les tableaux
Comment créer un tableau Java
Comment utiliser les expressions Java lambda
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java
Comment créer un résumé de calendrier Java
Un mémorandum sur l'utilisation d'Eclipse
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Explication facile à comprendre! ] Comment utiliser l'instance Java
[Introduction à Java] Comment écrire un programme Java
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
Comment créer un robot Discord (Java)
[Explication facile à comprendre! ] Comment utiliser le polymorphisme Java
[Java] [Maven3] Résumé de l'utilisation de Maven3
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
[Explication facile à comprendre! ] Comment utiliser ArrayList [Java]
[Java] Découvrez comment utiliser correctement Optional
[Explication facile à comprendre! ] Comment utiliser la surcharge Java
gestion des exceptions try-catch-finally Comment utiliser java
[Explication facile à comprendre! ] Comment utiliser l'encapsulation Java
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
[Java] Comment utiliser une sous-chaîne pour découper une partie d'une chaîne de caractères
Comment utiliser le mémo personnel codable de Swift
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Une histoire sur la prise en charge de Java 11 pour les services Web
Une histoire sur le JDK à l'ère de Java 11
Comment afficher une page Web en Java
Comment utiliser le framework Java avec AWS Lambda! ??
Comment convertir un contrat de solidité en une classe de contrat Java
Comment utiliser l'API Java avec des expressions lambda
[Explication facile à comprendre! ] Comment utiliser l'héritage Java [Explication de remplacement]
Comment utiliser la méthode replace () (Java Silver)