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
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 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.
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.
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.
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