Java probleme java.lang.StringIndexOutOfBound

Résolu/Fermé
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 - 27 août 2008 à 08:31
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 - 27 août 2008 à 10:04
Bonjour, dans un but personnel pour m'améliorer en programmation, je désire créer un programme qui me permet de crypter une suite de caractère selon la methode des carrés parfaits. Dans la vrai vie cette methode se fait ainsi car on utilise un nombre de caractère qui vaut un carré parfait (25/49/81/225 par exemple). On dessine un carré que l'o divise en carreaux, le nombre de carreaux vaut ce carré parfait, et il y a autant de carreaux en hauteur qu'en largeur. Puis on place les caractères en écrivant de haut en bas.
Avec Java, je désire faire la même chose, cependant ne pouvant pas faire un tableau bi dimentionnel, je propose une solution mathématiquement équivalente. à savoir
je calcule la racine carré puis
je prends les caractères par saut équivalents à cette racines carré et je recommence la boucle en décalant toujours de un caractère le début. sur le papier ça marche. par contre pour programmer... je fais ça :
//MetCarré est un JRadioButton, déclaré dans la classe parente.
else if(parent.MetCarré.isSelected()){
			//la je déclare mes variables
int racineEnt=0;
			double racineCarré;
			double lengt=texteEntré.length();
			racineCarré=Math.sqrt(lengt);
			char carré;
// là je créé la racine carré entière la plus proche, arrondie au suppérieur. 			
while (racineEnt<racineCarré){
				racineEnt++;
			}
			//si la racineCarré est enière et donc que le nombre de caractère est un carré parfait alors exécuter la boucle sans caractère supplémentaires
			if(racineCarré==racineEnt){
				int lettre;
				int groupe;
				for(lettre=1;lettre<racineEnt;lettre++){
					for(groupe=lettre;groupe<lengt;groupe+=racineEnt);
					carré=texteEntré.charAt(groupe);
					textecodé+=carré;
					
				}
// si la racineCarré est inférieure à la racineEnt calculée alros on rajoutera des caractère, ' ' pour que le nombre total de caractère soit un carré parfait

la partie soulignée correspond à la ligne 84 du message qui repporte toutes les erreur lors de l'exécution de ce code.

Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 26
	at java.lang.String.charAt(Unknown Source)
	at MoteurCrypto.actionPerformed(MoteurCrypto.java:84)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
A voir également:

4 réponses

il y a un ; en trop après le for (groupe ...); : les deux instructions qui suivent ne font pas partie de la boucle !
ce devrait être :
  for(groupe=lettre;groupe<lengt;groupe+=racineEnt) {
         carré=texteEntré.charAt(groupe);
         textecodé+=carré;
  }
2
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
27 août 2008 à 10:04
oui je viens de le remarquer en fait... c'est bien ça qui buggait... j'avais mis un ; au lieu d'un {} encore desolé.
en tout cas je suis bien content que ça marche
1
Bonjour

Les indices dans une chaine vont de 0 à longueur-1, et toi tu essayes d'afficher de 1 à longueur. Tu sors de la chaîne
0
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
27 août 2008 à 09:05
... même en faisant longueur-1 et en commençant à 0 j'y arrive pas...
-1