Problème en Java (charAt(0) ) !

Résolu
Bonjour,

Quand je compile mon programme , aucune erreur n'est détécté . Or , lors de l'exécution toute les lignes du code s'exécutent jusqu'à ce qu'il arrive à ce bloc érctit en dessous , et il m'affiche erreur et voilà ce qu'on m'affiche :

********************************************************************************
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
********************************************************************************
// Voilà la partie d'où vient l'erreur
char reponse = ' ' ;
do
{
System.out.println("Voulez-vous continuer O/N ? ");
reponse = sc.nextLine().charAt(0);

}while( reponse != 'O' && reponse != 'N');

Aidez - moi S'il vous Plaît !

Sisiniya .--
 Au travail, le plus difficile, c'est d'allumer la petite lampe du cerveau. Après, ça brûle tout seul. 
                                      --->> auteur : Jules Renard <<---
Configuration: Windows XP
Internet Explorer 7.0

29 réponses

Résumé de la discussion

Problématique centrale : une exception StringIndexOutOfBoundsException survient en Java lorsque l'utilisateur appuie sur Entrée et que l'instruction charAt(0) est appelée sur une chaîne vide après sc.nextLine(). Des éléments de réponse essentiels indiquent d'utiliser next() plutôt que nextLine(), car nextLine() lit la ligne entière et peut renvoyer une chaîne vide, ou effectuer une vérification de longueur avant charAt. Dans les échanges, la réponse la plus directe recommande d'utiliser sc.next().charAt(0) pour lire directement le premier caractère, évitant l'erreur lorsque l'entrée est vide ou dépourvue de caractère.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonsoir,
    @kmillo : ouai, souvent on lit l'entrée standard directement en faisant un System.in.read()... Je ne connaissais pas l'existance de la classe Scanner personnellement.

    Comme le dit Donuts08, nextLine() n'a pas l'air faite pour ça. Pourquoi n'utilises-tu pas next().charAt(0) comme le montre l'exemple de l'API ?

    Codialement.
    1. merci marco pour le System.in.read() ca fait 4 ans que j'ai pas progammer et j'avais qu'unpetit niveau, mais j'ai envie de m'y remettre...
  2. public static String lireString() // Lire un String
    {
    String tmp = "";
    char C='\0';
    try {
    while ((C=(char) System.in.read()) !='\n')
    {
    if (C != '\r') tmp = tmp+C;

    }
    }
    catch (IOException e)
    {
    System.out.println("Erreur de frappe");
    System.exit(0);
    }
    return tmp;
    }

    Personnellement j'utilise cette fonction pour être sur de récupérer une chaine de caractère en ligne de commande.
    cordialement ;)
    1. Salut,

      Les erreurs les plus grosses ne sont souvent pas vues !

      Désolé ma petite lampe n'était pas encore allumée.

      while ((!entree.equals("O")) && (!entree.equals("N"))); ferait l'affaire.

      Si on frappe O c'est différent de N et si on frappe N c'est différent de O et on boucle !!!

      while ((!entree.equals("O")) || (!entree.equals("N")));

      Voila ce qu'il faut. Si entree = "O" c'est bon OU si entree = "N" c'est bon et on ne boucle plus...

      Pour éviter de frapper O ou N obligatoirement en majuscule il serait bon après l'entrée d'ajouter :

      reponse = reponse.toUpperCase();

      Ainsi que l'on frappe soit O ou o , soit N ou n ce sera bon.

      Cordialement.
      Dan
      1. Salam,

        rep = next().charAt(0);
        et non nextLine()..

        apparemment il n'a pas de probléme avec la char mais plutot avec la String vu que tu lui demande d'extraire le premiére caractére de ce string qui est déclaré autant que char.

        Bon courage :)
        1. grrrr..
          rep = sc.next().charAt(0);
      2. Contributeur
        Bonsoir,
        Bien sûr, il faut garder le même objet et l'utiliser tout au long de ton programme (sinon ça va marcher aussi mais c'est moins bien).
        Si ton objet est défini au sein d'une méthode, tu ne pourras l'utiliser qu'au sein de cette méthode.
        Si tu en as besoin dans d'autres méthodes, il faut t'arranger pour augmenter la visibilité de ton objet (passage par paramètre de méthode, ou déclaration d'attribut si ça a un sens).

        Cordialement
        1. Oui je suis certaine , Vraiment c'est Bizard !! .En fait , j'ai aimé bien la Méthode de equalsIgnoreCase("O") .

          Une question si vous permettez _bien sûr _ :-) :

          Si je déclare au début de mon programme ceci : << Scanner ob = new Scanner(System.in) ; >> Est ce que
          J'ai le droit d'utilisé <<ob.nextLine(); >> pour lire des variables différents de Types String le long du Programme ou bien je doit à chaque fois créer un new Objet de classe Scanner ?

          Merci Beaucoup .

          Sisiniya .

          1. J'ai utilisé la 2éme :

            Scanner sc = new Scanner(System.in) ;

            String entree = "";
            do
            {
            System.out.println("Voulez-vous continuer O/N ? ");
            entree = sc.nextLine();

            }while ((!entree.equals("O")) && (!entree.equals("N")));

            ça marche bien , mais le seul souci c'est qu'il m'affiche deux fois <<Voulez-vous continuer O/N ? >> et après il me donne la main pour saisir la réponse !!

            Je vous remercie tous pour vos réponses .

            Merci danimo .

            Sisiniya .
            1. Bonjour,

              De toutes manières, remplace whil(..... par

              }while ((!entree.equalsIgnoreCase("O")) && (!entree.equalsIgnoreCase("N")));

              comme indiqué par tsou, ce qui te donnera la possibilité de saisir aussi bien en majuscule qu'en minuscule, mais qui ne resoudra pas le pb d'affichage 2 fois.

              Es-tu certaine de ne pas avoir plus haut dans to prog. System.out.println("Voulez-vous continuer O/N ? "); ?

              Cordialement.

              Dan
          2. Il faut utiliser soit

            Scanner sc = new Scanner(System.in) ;

            String entree = "";
            char reponse = ' ';
            do
            {
            System.out.println("Voulez-vous continuer O/N ? ");
            entree = sc.nextLine();
            try
            {
            reponse = entree.charAt(0);
            }
            catch(Exception E)
            {
            System.err.println("Erreur: " + E.getMessage());
            System.out.println("Vous n'avez rien entré");
            }

            }while((reponse != 'O') && (reponse != 'N'));

            soit

            Scanner sc = new Scanner(System.in) ;

            String entree = "";
            do
            {
            System.out.println("Voulez-vous continuer O/N ? ");
            entree = sc.nextLine();

            }while ((!entree.equals("O")) && (!entree.equals("N")));
            1. String reponse = "" ;
              do
              {
              System.out.println("Voulez-vous continuer O/N ? ");
              reponse = next();

              }while( !reponse.EqualsIgnoreCase("O") && !reponse.EqualsIgnoreCase("N"));
              1. // Voilà la partie d'où vient l'erreur
                char reponse = ' ' ;
                do
                {
                System.out.println("Voulez-vous continuer O/N ? ");
                reponse = sc.nextLine().charAt(0);

                }while( reponse != 'O' && reponse != 'N');

                =====================================

                String reponse = "";
                do
                {
                System.out.println("Voulez-vous continuer O/N ? ");
                reponse = sc.next();;

                }while(!reponse .EqualsIgnoreCase("O") && !reponse.EqualsIgnoreCase("N"));
                1. Alors , svp dis moi qu'est ce qui me manque ? en fait , je suis débutante en java . Je viens juste de l'apprendre !

                  Merci .
                  1. Salam,

                    rep = Next().charAt(0);

                    apparemment il n'a pas de probléme avec la char mais plutot avec la String vu que tu lui demande d'extraire le premiére caractére de ce string qui est déclaré autant que char.

                    Bon courage :)
                2. Contributeur
                  Tu as un java chelou moi avec l'une ou l'autre ça fonctionne sans souci.
                  1. Pour la Réponse de Danimo :

                    En utilisant cette ligne while ((!entree.equals("O")) && (!entree.equals("N"))); Heureusement le massage d'erreur est disparu , mais le problème c'est qu'il m'affiche "Voulez-vous continuer O/N ?" deux fois à la fois , et quand je tape par exemple O il reaffiche "Voulez-vous continuer O/N ?" . C'est comme si la condition ne sera jamais verifiée .

                    Vous avez quelques Supposition ?

                    Je vous remercie tous pour vos réponse .

                    Sisiniya .--
                     Au travail, le plus difficile, c'est d'allumer la petite lampe du cerveau. Après, ça brûle tout seul. 
                                                          --->> auteur : Jules Renard <<---
                    1. Bonjour,

                      Le mieux serait que tu nous montres ton code tel qu'il est actuellement.

                      Cordialement. Dan
                  2. Bonjour,

                    Ta frappe est récupérée dans un String !

                    Comme ca c'est ok:

                    Scanner sc = new Scanner(System.in) ;

                    String entree = "";
                    char reponse = ' ' ;
                    do
                    {
                    System.out.println("Voulez-vous continuer O/N ? ");
                    entree = sc.nextLine();
                    reponse = entree.charAt(0);

                    }while((reponse != 'O') && (reponse != 'N'));

                    Mais charAt n'est pas nécessaire :
                    while ((!entree.equals("O")) && (!entree.equals("N"))); ferait l'affaire.

                    Cordialement.

                    Dan
                    1. Salut, la classe Scanner est nouvelle (question con es-tu sûr que ton sdk est assez récent). Par contre la syntaxe est bonne d'après ce que je lis ici :
                      http://www.labo-sun.com/resource-FR-codesamples-416-0-java-io-recuperation-de-donnees-grace-a-la-nouvelle-classe-scanner-java-5-0-.htm
                      A ta place je suivrai le conseil du message 11 de kmillo pour bien être sûr que le début est juste
                      1. tu travaille dans la console? ce n'est pas (sc.nextLine) pour recuperer les infos. là je ne sait plus mais je te tiens au jus.
                        en entendant essaie :
                        char reponse = ' ' ;
                        do
                        {
                        System.out.println("Voulez-vous continuer O/N ? ");
                        reponse = 'O';

                        }while( reponse != 'O' && reponse != 'N');

                        au moins tu verra si ca marche, mais moi j'utiliser autrechose pour lire les info de la cosole
                        1. D'accord , je vais sûrement le consulter .

                          Merci pour vos remarques << donuts08 >>
                          • 1
                          • 2