IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

java.lang.StringIndexOutOfBoundsException incompréhensible


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut java.lang.StringIndexOutOfBoundsException incompréhensible
    Bonjour,
    Cela fait quelque temps que je me suis mis a la programmation mais le je me retrouve face a un problème que je n'arrive a résoudre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    package projetTest;
     
    import java.util.*;
     
    public class classeTest {
     
     
     
      public static void main(String[] args){
     
    	  Scanner sc = new Scanner(System.in);
    	  double nombre, nombreSauve;
    	  int choix;
    	  char reponse = 'O';
     
     
     
     
    	  while(reponse == 'O'){  
     
    		  System.out.println("1 - Convertisseur Celsius/Fahrenheit");
    		  System.out.println("2 - Convertisseur Fahrenheit/Celsius");
    		  System.out.println("Que voulez-vous faire ? (1 ou 2)");
     
    		  choix = sc.nextInt();
     
    	  if (choix < 2){
    		            System.out.println("Quelle est la Température"
    		            + " en degré Celsius a "
    		  		    + "convertir en degré Fahrenheit ?");
    		  			nombre = sc.nextDouble();
    		  			nombreSauve = nombre;
    		  			nombreSauve = ( 1.8*nombre)+32;
    		  			System.out.println(nombre + "°C correspond à " + nombreSauve + "°F");
    	  				}
     
    	  else {
                System.out.println("Quelle est la Température"
                + " en degré Fahrenheit a "
    		    + "convertir en degré Celsius ?");
    			nombre = sc.nextDouble();
    			nombreSauve = nombre;
    			nombreSauve = ((nombre - 32)*5)/9;
    			System.out.println(nombre + "°F correspond à " + nombreSauve + "°C");
    			}
     
    	   do{
    	    System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
    	    reponse = sc.nextLine().charAt(0);
     
    	  }while(reponse == 'O');
    	  }
    	  System.out.println("Au revoir !");
     
     
     
                                       }
      }
    Voila le petit, tout petit programme que j'essaye de faire mais j'ai toujours ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    1 - Convertisseur Celsius/Fahrenheit
    2 - Convertisseur Fahrenheit/Celsius
    Que voulez-vous faire ? (1 ou 2)
    1
    Quelle est la Température en degré Celsius a convertir en degré Fahrenheit ?
    50
    50.0°C correspond à 122.0°F
    Souhaitez-vous convertir une autre Température ? (Oui ou Non)
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    	at java.lang.String.charAt(Unknown Source)
    	at projetTest.classeTest.main(classeTest.java:50)
    J'ai beau me relire dans tous les sens je ne trouve pas la solution à ce problème.

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si tu veux l'explication détaillée du pourquoi et du comment, clique sur "Montrer"

    La classe Scanner permet de lire plus facilement des informations saisie au clavier en console. Tous les caractères tapées sont stockées dans un tampon. Lorsqu'on fait appel à des méthodes comme nextDouble(), la classe Scanner analyse les caractères qui sont au début du tampon pour vérifer qu'il y a bien des caractères qui forment ce qu'on demande (un double avec nextDouble()) : ces méthodes ignorent automatiquement certains caractères séparateurs (appelés delimiters pour le Scanner), comme les espaces ou les retour-chariot (qui correspondent à la touche entrée), qui se trouve avant les chiffres (et le .) qui vont être utilisés pour le double.

    Mais tout ce qui se trouve encore dans le tampon après ce qui a été trouvé pour constituer le double reste dans le tampon, pour pouvoir être traité ensuite.

    Or, quand tu saisis un nombre, tu appuis sur la touche entrée juste après pour valider la saisie. Et le retour-chariot qui correspond est mis dans le tampon : donc nextDouble() récupère le nombre mais laisse le retour-chariot. Quand tu fais nextLine() ensuite, ça lit la prochaine ligne de caractères dans le tampon, c'est-à-dire tout ce qu'il y a dans le tampon jusqu'au prochain retour-chariot. Soit une chaine vide (puisque le retour-chariot était juste après le nombre dans ta saisie). Donc quand tu demandes le premier caractère de cette chaîne vide par sc.nextLine().charAt(0) tu obtiens une exception qui dit qu'il n'y a pas de caractère dans la chaine (ou plus exactement qu'il n'y a pas assez de caractères pour obtenir un caractère en position 0).


    Pour résoudre ce problème, il faut d'abord vider le tampon et ensuite lire les prochains caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // vide le tampon si nécessaire
    if ( sc.hasNextLine() ) {
       sc.nextLine();
    }
     
    do{
        System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
        reponse = sc.nextLine().charAt(0);
     
    }while(reponse == 'O');
    Seulement cette méthode présente un problème : si l'utilisateur tape directement entrée sans rien saisir, tu auras quand même l'exception parce que nextLine() retournera une chaine vide.

    Il vaut mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do{
        System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
        String nextLine = line.nextLine();
        if ( nextLine.length()>0 ) {
            reponse = line.charAt(0);
        }
        else {
            reponse = 'N';
        }
     
    }while(reponse == 'O');
    Ou, avec une response de type String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do{
        System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
        reponse = line.nextLine();
     
    }while("O".equals(reponse));
    Il y a un second problème dans cette boucle : ce qu'elle fait c'est reposer la question "Souhaitez-vous convertir une autre Température ? (Oui ou Non)" tant qu'on saisit un O. Si on saisit un N, un Non, un Oui, un oui, ou toto, ou jambon, ça s'arrête.

    Conséquence :
    • si on saisit O, on nous demande de resaisir
    • si on saisit autre chose, on essaye l'autre boucle while dont la condition reponse == 'O' ne peut être que false (puisqu'on a pas saisit O, donc le programme s'arrête.


    Donc ce serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do{
        System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
        String nextLine = line.nextLine();
        if ( nextLine.length()>0 ) {
            reponse = line.charAt(0);
        }
        else {
            reponse = '\0'; // ou n'importe quel caractère autre que O ou N
        }
     
    }while(reponse != 'O'  && respose != 'N');
    Pour demander de saisir continuellement quelque chose tant que ce n'est pas 'O' ou 'N' qui est entré.

    Ou avec reponse de type String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do{
        System.out.println("Souhaitez-vous convertir une autre Température ? (Oui ou Non)");
     
        reponse = line.nextLine();
     
    }while( !("O".equals(reponse) || "N".equals(reponse)) );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Reussi
    Merci beaucoup joel.drigo pour cette réponse très complète, j'avais effectivement déjà entendu parler de ces "exceptions" se trouvant dans les tableaux mais je n'en avais pas vraiment saisis le sens J'y ferais plus attention à l'avenir

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2014, 15h14
  2. Réponses: 3
    Dernier message: 21/04/2011, 00h12
  3. Réponses: 4
    Dernier message: 14/01/2010, 18h44
  4. java lang StringIndexOutOfBoundsException ?
    Par titof dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 05/08/2008, 14h54
  5. Réponses: 4
    Dernier message: 22/01/2004, 08h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo