Lire les entrées clavier


Lire les entrées clavier
Dans ce chapitre, nous verrons comment lire les entrées clavier.
Nous survolerons ceci sans voir les différents cas d'erreurs que cela peut engendrer.
Trêve de bavardage, je suis sûr que vous êtes impatients...
Sommaire du chapitre :

  • Utilisation de l'objet Scanner
  • Récupérez ce que vous tapez

Utilisation de l'objet Scanner

Je me doute qu'il vous tardait de pouvoir communiquer avec votre application...
Le moment est enfin venu ! Mais je vous préviens, la méthode que je vais vous donner a des failles.
Je vous fais confiance pour ne pas rentrer n'importe quoi n'importe quand...

Pour les puristes qui me diront "ouais, mais si je rentre ça, tu vas te prendre une belle exception dans ta face !", je le sais, mais je ne trouve pas opportun de vous parler des exceptions et de la manière de les capturer maintenant... Bon. Allons-y !

Je vous ai dit que vos variables de type String sont en fait des objets de type String. Pour que Java puisse lire ce que vous tapez au clavier, vous allez devoir utiliser un objet de type Scanner (merci à Myhtrys).
Je vous rappelle que pour instancier un objet, c'est-à-dire créer un nouvel objet afin de s'en servir, vous devez utiliser l'opérateur unaire new().


Cet objet peut prendre différents paramètres, mais ici, nous n'en utiliserons qu'un. Celui qui correspond justement à l'entrée standard en Java.
Lorsque vous faites System.out.println();, je vous rappelle que vous appliquez la méthode println() sur la sortie standard ; or ici, nous allons utiliser l'entrée standard System.in.
Donc, avant de dire à Java de lire ce que nous allons taper au clavier, nous devrons instancier un objet Scanner.
Pour pouvoir utiliser un objet Scanner, nous devons dire à Java où trouver cet objet !

Avant de vous expliquer ceci, créez une nouvelle classe et tapez cette ligne de code dans votre méthode main :
Code : Java  
1
Scanner sc = new Scanner(System.in);

Vous devez avoir une zolie vague rouge sous le mot Scanner.
Mais souvenez-vous de l'astuce que je vous avais donnée pour le cast de variables. Cliquez sur la croix rouge sur la gauche et double-cliquez sur "Import 'Scanner' java.util". Et là, l'erreur disparaît !



Maintenant, regardez tout au dessus de votre classe, au dessus de la déclaration de celle-ci, vous devez avoir une ligne :
Code : Java  
1
import java.util.Scanner;


Voilà ce que nous avons fait. Je vous ai dit qu'il fallait dire à Java où se trouve la classe Scanner.
Pour faire ceci, nous devons importer la classe Scanner, grâce à l'instruction import.
La classe que nous voulons se trouve dans le package java.util.
Tout d'abord, vous devez savoir que le langage Java n'est qu'une multitude de classes ordonnées en packages. Par défaut, Java incorpore automatiquement un package contenant les fondements de Java : java.lang. C'est dans ce package qu'il y a les variables de bases, la classe System et beaucoup d'autres choses qui vous permettent de faire des programmes. Pour voir le contenu de ce package, vous pouvez allez voir ici.

Je pense que vous avez compris qu'un package est en fait un ensemble de classes. En fait, c'est un ensemble de dossiers et de sous-dossiers contenant une ou plusieurs classes.
Par exemple, nous avons importé tout à l'heure la classe Scanner qui se trouve dans le package java.util. Remplacez les . par des /, l'arborescence des dossiers est donc java/util/ et dans ce dossier se trouve le fichier Scanner.class ! Vous verrez ceci plus en détail lorsque nous ferons nos propre packages.

Les classes qui se trouvent dans les autres packages que java.lang sont à importer à la main dans vos classes Java pour pouvoir vous en servir.
La façon dont nous avons importé la classe java.util.Scanner dans Eclipse est très pratique et très simple. Vous pouvez aussi le faire manuellement en tapant :
Code : Java
1
2
3
4
//Ceci importe la classe Scanner du package java.util
import java.util.Scanner; 
//Ceci importe toutes les classes du package java.util
import java.util.*;

Si vous faites vos imports manuellement, n'oubliez surtout pas le ; à la fin !

Maintenant que vous avez assimilé ceci, nous pouvons retourner à nos moutons !

Récupérez ce que vous tapez

Retournons à notre morceau de code, pour mémoire :
Code : Java
1
Scanner sc = new Scanner(System.in);


Afin de vous préparer à saisir des informations, veuillez afficher un message à l'écran ; nous avons donc :
Code : Java
1
2
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un mot :");

Maintenant, voici l'instruction pour permettre à Java de récupérer ce que vous avez saisi et ensuite de l'afficher :
Code : Java
1
2
3
4
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un mot :");
String str = sc.nextLine();
System.out.println("Vous avez saisi : " + str);

Une fois l'application lancée, le message que vous avez écrit auparavant s'affiche dans la console, en bas dans Eclipse (vous avez l'habitude, maintenant).
Pensez à cliquer dans la console, après votre message, afin que ce que vous saisissez soit écrit dans la console, pour que Java puisse récupérer ce que vous avez inscrit !



Alors ? Heureux ?
Voilà votre première saisie clavier ! Comme vous avez pu le constater, l'instruction nextLine() renvoie une chaîne de caractères. Si vous avez essayé de remplacer la variable de type String par une variable d'un autre type, vous avez dû voir qu'Eclipse n'apprécie pas du tout... Et si vous avez cliqué sur la croix rouge pour corriger le problème, vous constatez que la seule solution qu'il vous propose est de changer le type de votre variable pour le type String.
Vous aurez remarqué aussi qu'Eclipse vous simplifie la vie au maximum. Lorsque vous tapez "sc.", Eclipse vous propose une liste de méthodes appartenant à cet objet.

Si vous remplacez la ligne de code qui récupère une chaîne de caractères comme suit :
Code : Java
1
2
3
4
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir un nombre :");
int str = sc.nextInt();
System.out.println("Vous avez saisi le nombre : " + str);

vous devez voir que lorsque vous utilisez votre variable de type Scanner, et où vous tapez le point permettant d'appeler des méthodes de l'objet, Eclipse vous donne une liste de méthodes associées à cet objet et, lorsque vous commencez à taper le début de la méthode nextInt(), le choix se restreint jusqu'à ne laisser que cette seule méthode.

Exécutez et testez ce programme et vous verrez qu'il fonctionne à la perfection ! Sauf... si vous saisissez autre chose qu'un entier !
C'est ce que je vous disais au départ de ce chapitre. L'objet essaie de récupérer un entier, mais si vous lui donnez autre chose, une exception est levée ! Nous verrons ceci lorsque nous programmerons des objets...

Pour les curieux, voici ce que donnerait l'erreur :



Vous savez maintenant que pour lire un int, vous devez utiliser nextInt().
De façon générale, dites-vous que pour récupérer un type de variable, il vous suffit d'appeler next<Type de variable commençant par une majuscule> (rappelez-vous de la convention de nommage !).
Bon. C'est mon jour de bonté :
Code : Java
1
2
3
4
5
6
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
double d = sc.nextDouble();
long l = sc.nextLong();
byte b = sc.nextByte();
//etc

Attention : il y a un type de variable primitive qui n'est pas pris en compte par la classe Scanner ; il s'agit des variables de type char.


Voici comment on pourrait récupérer un caractère :
Code : Java
1
2
3
4
5
System.out.println("Saisissez une lettre :");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char carac = str.charAt(0);
System.out.println("Vous avez saisi le caractère : " + carac);


Qu'est-ce que nous avons fait ici ?
Nous avons récupéré une chaîne de caractères, puis nous avons utilisé une méthode de l'objet String (ici, charAt(0) ) afin de récupérer le premier caractère saisi !
Même si vous tapez une longue chaîne de caractères, l'instruction charAt(0) ne renverra que le premier caractère...
Vous devez vous demander pourquoi charAt(0) et non charAt(1) ? Ne vous inquiétez pas, nous aborderons ce point lorsque nous verrons les tableaux...



Jusqu'à ce qu'on aborde les exceptions, je vous demande d'être rigoureux et de faire attention à ce que vous attendez comme donnée afin d'utiliser la bonne méthode.

Une précision toutefois. La méthode nextLine() récupère le contenu de toute la ligne saisie et repositionne la "tête de lecture" au début d'une autre ligne. Par contre, si vous avez invoqué une méthode comme nextInt() , nextDouble() et si vous invoquez directement derrière la méthode nextLine() , celle-ci ne vous invitera pas à saisir une chaîne de caractères mais elle videra la ligne commencée précédemment par les autres instructions car celles-ci ne repositionnent pas la tête de lecture, l'instruction nextLine() le fait donc à leurs place. Pour faire simple, ceci :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import java.util.Scanner;
 
public class Main {
        public static void main(String[] args){
               Scanner sc = new Scanner(System.in);
               System.out.println("Saisissez un entier : ");
               int i = sc.nextInt();
               System.out.println("Saisissez une chaîne : ");
               String str = sc.nextLine();           
               System.out.println("FIN ! ");
        }
}


ne vous demandera pas saisir une chaîne et affichera directement "Fin". Pour pallier ce problème il suffit de vider la ligne après les instructions ne le faisant pas :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import java.util.Scanner;
 
public class Main {
        public static void main(String[] args){
               Scanner sc = new Scanner(System.in);
               System.out.println("Saisissez un entier : ");
               int i = sc.nextInt();
               System.out.println("Saisissez une chaîne : ");
                //On vide la ligne avant d'en lire une autre
                sc.nextLine();
               String str = sc.nextLine();           
               System.out.println("FIN ! ");
        }
}


J'espère que cette partie vous a plu et que vous êtes encore en forme...
A partir de maintenant, nous allons aborder les différentes instructions du langage.
Commençons par les conditions.




6 comments to "Lire les entrées clavier"

  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    Scanner sc = new Scanner(System.in);
    Quell différence

  • Merci pour ce travail important

  • même cours que openclassroom, qui a copié sur qui???? longue vie au copié collé

  • Heu...aucun problème de copier coller puisque c le même site qui a juste changé de nom.

  • Bonjour,
    Dans un programme similaire je à l'utilisateur de rentrer "oui" si il veut recommencer le programme, mais la boucle ne se relance pas.
    Si quelqu'un pouvais m'aider ça me ferait progresser énormément je pense! Merci en tout cas pour ce blog, c'est très bien expliqué et agréable à suivre.

    Pour info, voici mon code :
    import java.util.Scanner;
    public class TEST {

    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {

    int a;
    int b;
    String reponse;
    do{
    System.out.println("Devinez le chiffre compris entre 1 et 10");
    System.out.println("Entrez un chiffre : ");
    a=scanner.nextInt();

    while(a!=4&&a<4){
    System.out.println("ce n'est pas ça, c'est un chiffre plus grand...");
    System.out.println("Entrez un chiffre : ");
    a=scanner.nextInt();
    }
    while(a!=4&&a>4){
    System.out.println("ce n'est pas ça, c'est un chiffre plus petit...");
    System.out.println("Entrez un chiffre : ");
    a=scanner.nextInt();
    }

    if(a==4){
    System.out.println("Bravo!");
    scanner.nextLine();
    }
    System.out.println("voulez-vous recommencer ?");

    reponse=scanner.nextLine();

    }while(reponse=="oui");

  • Je veux bien comprendre les entrer clavier . Et la signification de ces mots.

Post a Comment

About This Blog

Aller au debut de la page