Rechercher : dans
Par :

Java probleme java.lang.StringIndexOutOfBound

Dernière réponse le 27 aoû 2008 à 10:04:42 artragis, le 27 aoû 2008 à 08:31:37 
 Signaler ce message aux modérateurs

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)
Configuration: Windows Vista
Firefox 3.0.1

1

toto, le 27 aoû 2008 à 08:48:14

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

Répondre à toto

2

artragis, le 27 aoû 2008 à 09:05:15

... même en faisant longueur-1 et en commençant à 0 j'y arrive pas...

Répondre à artragis

3

toto, le 27 aoû 2008 à 09:59:42

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é;
  }

Répondre à toto

4

 artragis, le 27 aoû 2008 à 10:04:42

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

Répondre à artragis
Collection CommentÇaMarche.net