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

Java Discussion :

Probleme de StringIndexOutOfBoundsException


Sujet :

Java

  1. #1
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Probleme de StringIndexOutOfBoundsException
    Bonjour tout le monde j'ai un exo de programmation en licence 1 d'informatique (donc on va dire que nous somme au commencement).
    Nous n'avons pas encore vu les traitement de chaine de caractère en cours mais je veux me mettre en avance.
    je vous ai mis l'énoncé
    j'ai decoupé en deux sous algo et un programme principal mais ce n'est pas encore fini je ne traite que deux point de l'exo. mais pour l'execution du deuxime sous algo j'ai une erreur, pas de compilation mais d'execution. soit disant que je traite une chaine vide, le pb est peut etre tout bete mais je ne trouve vraiment pas :
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    at java.lang.String.substring(Unknown Source)
    at soundex.vowel(soundex.java:45)
    at soundex.main(soundex.java:68)
    le but est de supprimer toute les voyelles du nom dc je parcours toute les lettre et je fais un traitement si c'est une voyelle.
    Je vous laisse juger

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    //~ Le Soundex Code est utilisé par les administrations américaines pour regrouper sous un même
    //~ code les noms ayant des consonnances voisines. Le code que nous considèrons ici 
    //~ en est une version simplifiée, il associe à un nom l'abbréviation obtenue en applicant les quatres règles suivantes :
     
    //~ a) Conserver la 1ere lettre du nom
    //~ b) Supprimer toutes les voyelles apparaissent ensuite 
    //~ c) Remplace les lettres doublées par une seule
    //~ d) 4 lettres max
     
    //~ Dupont		---> DPNT
    //~ Lloyd		---> LD
    //~ Rastatopoulos	---> RSTT
     
    public class soundex{
     
     
    	public static char firstChar(String name){
    		/*Var*/
    		char first;
    		/*Body*/
    		first = (name.charAt(0));
    	return first;
    	}
     
    	public static String vowel(String name){ //Suppression de toutes les voyelles : traite le nom mais pas la premiere lettre quelqu'elle soit
    		/*Var*/
    		String name_without_vowel= " " , name2;
    		int cpt;
    		int length;
    		char char_current;
    		/*Body*/
    		name = name.substring(1); 	// exlus la premiere lettre
    		System.out.println(name);
    		length = name.length(); 	// mesure la taille de 'name' sans la premiere lettre
    		System.out.println(length);
    		name2=name;
    		String str="";
    		for(cpt=0;cpt<=length;cpt++){
     
    			char_current=name2.charAt(cpt);
    			System.out.println(cpt);
    			if((char_current=='a' || char_current=='e' || char_current=='i' || char_current=='o' || char_current=='u' || char_current=='y' )){
    				System.out.println("dans le if");
     
    				name2 = name2.substring(cpt+1,length);
    				name = name.substring(0,cpt);
    				name2 = name.concat(name2);
     
    				cpt=-1/*cpt-1*/; //-1 pour recommencer le test a la premiere lettre ou 'cpt-1' pour reprendre le test
    				System.out.println(name2);
    			}
    		System.out.println("hors du if");
    		}
     
    		name_without_vowel= name2;
    	return name_without_vowel; 
    	}
     
    	public static void main (String [] args){
    		/*Var*/
    		String Name;
     
    		/*Body*/
    		System.out.println("Nom : ");
    		Name= Clavier.readString();
     
    		//System.out.println(firstChar(Name));
    		System.out.println(vowel(Name));
     
     
    	}
    }
    Merci par avance pour votre aide.

    Ps : pour l'exécution j'ai une classe toute faite pour la saisie au clavier dc il vous sera impossible de l'exécuter cependant l'erreur devrait vous être relativement repérable je l'espère.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Erreur classique : dans ta boucle for, la longueur de ta chaîne "name" est modifiée, et ta boucle for n'en tient pas compte
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    La ligne en question est celle-ci, je suppose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    				name2 = name2.substring(cpt+1,length);
    L'erreur est simple : à la ligne 38, tu fais une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		for(cpt=0;cpt<=length;cpt++){
    Or length représente la longueur de la chaîne.

    Mettons que ta chaîne fasse 5 caractères : texte . La taille de chaîne est de 5, mais l'index de ses caractères vont de 0 à 4. En java, tous les indices commencent à 0.

    Il faut donc modifier ta boucle comme ceci, pour éviter de demander le 6e caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		for(cpt=0;cpt<length;cpt++){

  4. #4
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'avais deja essayer de retirer le "=" mais rien n'y fais j'ai même mis cpt<length-1 pour etre sur qu'il parcours tout et meme erreur je peux envoyer la classe clavier si qqun veux reelement essayer

  5. #5
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Le problème n'est pas la (à mon sens). Tu calcule avant ta boucle la longueur de ta chaine de caractère et tu parcours caractère par caractère. Mais au faire et à mesure de ta boucle tu diminue la taille de ta chaine de caractère sans recalculer condition de la coucle.
    Je pense que tu devrais recalculer la taille de ta chaine à chaque fois que tu la modifie (et également remplacer le <= par un <.
    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
     
    for(cpt=0;cpt<length;cpt++){
     
    			char_current=name2.charAt(cpt);
    			System.out.println(cpt);
    			if((char_current=='a' || char_current=='e' || char_current=='i' || char_current=='o' || char_current=='u' || char_current=='y' )){
    				System.out.println("dans le if");
     
    				name2 = name2.substring(cpt+1,length);
    				name = name.substring(0,cpt);
    				name2 = name.concat(name2);
    				length = name.length(); 
    				cpt=-1/*cpt-1*/; //-1 pour recommencer le test a la premiere lettre ou 'cpt-1' pour reprendre le test
    				System.out.println(name2);
    			}
    		System.out.println("hors du if");
    		}
    En espérant t'aider
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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