CodeGym/Blog Java/Random-FR/Classe d'analyseur Java
Auteur
Milan Vucic
Programming Tutor at Codementor.io

Classe d'analyseur Java

Publié dans le groupe Random-FR
membres
Salut! Notre leçon d'aujourd'hui sera spéciale ! Dans la leçon d'aujourd'hui, nous parlerons de Java Scanner Class. Auparavant, le processus d'exécution des tâches et d'écriture des programmes était simple : nous écrivons du code, exécutons main ()méthode, le programme fait ce qui est nécessaire, et nous avons terminé. Mais maintenant tout va changer ! Aujourd'hui, nous allons apprendre à vraiment interagir avec le programme : nous allons lui apprendre à réagir à nos actions ! Avant de commencer à analyser le code, avez-vous déjà eu affaire à un appareil comme un scanner ? Probablement. L'intérieur d'un scanner est assez compliqué, mais l'idée de base de son fonctionnement est très simple : il lit les données fournies par l'utilisateur (comme un passeport ou une police d'assurance) et stocke ces informations en mémoire (par exemple, sous forme d'image ). Aujourd'hui, vous allez créer votre propre scanner ! Bien sûr, il ne pourra pas gérer les documents papier, mais le texte ne lui posera aucun problème :) C'est parti !

La classe Scanner de Java

Classe de scanner - 1Tout d'abord, nous devons nous familiariser avec la classe java.util.Scanner . Sa fonctionnalité est très simple. Comme un vrai scanner, il lit les données d'une source que vous spécifiez. Par exemple, une chaîne, un fichier, la console. Ensuite, il reconnaît les informations et les traite de manière appropriée. Voici l'exemple le plus simple :
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Nous avons créé un objet scanner et spécifié sa source de données (une chaîne de texte). La méthode nextLine() accède à la source de données (notre texte avec un quatrain), trouve la prochaine ligne non lue (qui est la première ligne dans ce cas) et la renvoie. Ensuite, nous l'affichons sur la console : Sortie de la console :
It matters not how strait the gate,
Nous pouvons utiliser la méthode nextLine() plusieurs fois et afficher l'intégralité de l'extrait de poème :
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
A chaque fois, notre scanner avance d'un pas et lit la ligne suivante. La sortie du programme s'affiche :
It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate,
I am the captain of my soul
Comme nous l'avons déjà dit, la source de données du scanner n'a pas besoin d'être une chaîne. Par exemple, cela pourrait être la console. Une nouvelle passionnante pour vous : auparavant, nous affichions simplement les données, mais maintenant nous allons lire les données du clavier ! Voyons ce que fait d'autre la classe Scanner :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
La méthode nextInt() lit et renvoie le nombre saisi. Dans notre programme, nous l'utilisons pour attribuer une valeur à la variable number . C'est déjà plus comme un vrai scanner ! Le programme demande à l'utilisateur d'entrer n'importe quel nombre. Une fois que l'utilisateur a fait cela, le programme remercie l'utilisateur, affiche le résultat et se termine. Mais nous avons encore un sérieux problème. L'utilisateur peut faire une erreur et saisir quelque chose d'incorrect. Voici un exemple où notre programme actuel cesse de fonctionner :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Essayons d'entrer la chaîne "CodeGym" à la place d'un nombre : Sortie de la console :
Enter a number:
CodeGym
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Main.main(Main.java:10) Process finished with exit code 1
Euh, oh. Nous avons de gros problèmes -_- Pour éviter de telles situations, nous devons trouver un moyen de vérifier les données saisies par l'utilisateur. Par exemple, si l'utilisateur entre autre chose qu'un nombre, il serait bon d'afficher un avertissement indiquant que l'information saisie n'est pas un nombre. Et si l'information est correcte, alors nous pourrions la confirmation. Mais cela nous obligerait à "regarder vers l'avenir" pour voir ce qui s'en vient dans notre flux. Scanner peut-il faire cela ? Et comment! Et il dispose d'un grand nombre de méthodes pour ce faire : hasNextInt() — Cette méthode vérifie si le prochain bloc de données d'entrée est un nombre (renvoie vrai ou faux, selon le cas). hasNextLine() — Cette méthode vérifie si le bloc d'entrée suivant est une chaîne. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Toutes ces méthodes effectuent des vérifications similaires pour les types de données restants. Essayons de changer notre programme de lecture des nombres :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Maintenant, notre programme vérifie si le prochain caractère saisi est un nombre. Et il affiche une confirmation uniquement si c'est le cas. Si l'entrée ne passe pas la vérification, le programme en prend note et demande à l'utilisateur de réessayer. Fondamentalement, vous pouvez communiquer avec l' objet Scanner et savoir à l'avance quel type de données vous attend. Un nombre, une chaîne ou autre chose ? Un numéro? Et quel genre ? Un int , short , long ?" Cette flexibilité vous donne la possibilité de construire une logique de programme qui dépend du comportement de l'utilisateur. Nous devrions noter une autre méthode importante : useDelimiter() . Vous passez une chaîne à cette méthode. La chaîne contient le caractères que vous souhaitez utiliser comme séparateurs ou délimiteurs. Par exemple, supposons que nous nous intéressions soudainement à la poésie japonaise et que nous décidions d'utiliser notre scanner pour lire un haïku écrit par le grand poète Matsuo Bashō. Même si trois versets différents nous sont transmis comme une chaîne maladroite, nous pouvons facilement les diviser et les rendre magnifiquement :
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Nous utilisons "\ n /*/*/*" (caractère de nouvelle ligne et trois astérisques) comme délimiteur. En conséquence, nous avons une belle sortie console, tout comme dans les livres :
On a withered branch
A crow has alighted.
Nightfall in autumn.

***

Such a moon above,
Like a tree cut at the root:
The fresh cut is white.

***

How the river floods!
A heron wanders on short legs,
Knee-deep in the water.
Cet exemple a une méthode de plus que nous devons absolument souligner : close() . Comme tout objet travaillant avec des flux d'E/S, l'analyseur doit être fermé lorsqu'il est terminé afin qu'il cesse de consommer les ressources de l'ordinateur. N'oubliez jamais la méthode close() !
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

       sc.close(); // Now we've done everything right!

   }
}
C'est ça! Comme vous pouvez le voir, pour son utilité, la classe Scanner est assez facile à utiliser ! :) Pour renforcer ce que vous avez appris, nous vous suggérons de regarder une leçon vidéo de notre cours Java
Commentaires
  • Populaires
  • Nouveau
  • Anciennes
Tu dois être connecté(e) pour laisser un commentaire
Cette page ne comporte pas encore de commentaires