Java.lang.StringIndexOutOfBoundsException: String

domxaline -  
 domxaline -
Bonjour,

lors de l'exécution mon prg plante et donne le message suivantes:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -103
at java.lang.String.substring(Unknown Source)
at Crypto3.main(Crypto3.java:21)

quelqu'un peut m'aider svp

import java.util.Scanner;
public class Crypto3
{
public static void main(String[] args)
{
String bla,code;
//int i,decal;
System.out.println("Entrez la phrase à coder:");
Scanner sc=new Scanner(System.in);
bla=sc.nextLine();
System.out.println("Entrez l'alphabet clé:");
char cle=sc.next().charAt(0);
String alpha="abcdefghijklmnopqrstuvwxyz";
code="";
for(int i=1;i<bla.length();i++)
{

String let=bla.substring(i,1);
boolean pos=alpha.contains(bla);
code = bla.substring(cle,i);
}
bla=code;
System.out.println("La phrase codée est:"+bla);
}
}



6 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Tu fais
bla.substring(cle,i);
avec
char cle
alors que substring s'utilise avec deux int, tu dois faire la conversion.
0
domxaline
 
vous voulez que je fasse comme ceci
code = bla.substring((char) cle,i);
non marche pas toujour la même erreur
0
faseldi Messages postés 279 Date d'inscription   Statut Membre Dernière intervention   20
 
Bonsoir, la méthode a ce profil : substring(int debut, int fin)
Tu ne peux donc pas l'utiliser avec un char, je ne vois pas ce que tu veux faire avec la méthode substring, mais il va sûrement te falloir écrire une nouvelle méthode qui fait ce que tu souhaites.
Je vois plusieurs fautes, telles que l'utilisation de ' i ' dans la méthode substring, qui doit planter car (petite demo :
par exemple :
String chaine="bonjour";
String sous = chaine.substring(0,10); // et erreur, car la chaine contient moins de 10 lettres!

L'autre erreur que je vois est sur le code:
Tu fais code = .... dans une boucle
Je suppose que ce que tu souahites doit etre code+=...
Sinon il n'y a pas d'interet à mettre des valeurs à code dans une boucle, si c'est pour que la seule valeur utilisée par code soit la dernièere itération de la boucle
Autre (erreur), peut être ?
tu mets deux String, bla et code
à la fin tu dis bla=code;
Il y a peut d’intérêt ici de stocker deux fois la même valeur, pour faire un affichage
0
domxaline
 
merci pour vos aides

" je ne vois pas ce que tu veux faire avec la méthode substring, mais il va sûrement te falloir écrire une nouvelle méthode qui fait ce que tu souhaites."


voilà ce que je veux faire ceci:

mon cryptographie:consiste à opérer non avec un décalage systématique, mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé, dans lequel les lettres se succèdent de manière désordonnée, par exemple:
HYLUJPVREAKBNDOFSQZCWMGITX
C'est cette clé qui va servir ensuite à coder le message. Selon notre exemple,
Les A deviendront des H, les B des Y, les C des L etc.

veuillez m'expliquer avec plus détails, je ne comprend pas bien
oublions substring vous avez d'autres solution svp?
0
domxaline
 
"L'autre erreur que je vois est sur le code:
Tu fais code = .... dans une boucle "

comme vous m'avez dit j'ai mis le code extérieur du boucle
j'ai erreur message suivante:

domini
Entrez l'alphabet clé:
ertfsyk
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at Testing5.main(Testing5.java:42)


for(i=1;i<bla.length();i++)
{
String let=bla.substring(i,+1);
boolean pos=alpha.contains(bla);
}
code = alpha.substring(cle,i);
bla=code;
System.out.println("La phrase codée est:"+bla);
System.out.println();
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
domxaline
 
merci pour vos aides.
j'ai erreur message:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The type of the expression must be an array type but it resolved to char

at Testing5.main(Testing5.java:32)


import java.util.Scanner;
public class Testing5
{
public static void main(String[] args)
{
char first[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

char second;
char tab[]=new char[second];
for(char i=0;i<second;i++)
{
System.out.println("Entrez votre clé:");
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
second=str.charAt(0);
}
System.out.println("Enter the name: ");
String n;
int len=n.length();
for(int i=0;i<len;i++)
{
for(int j=0;j<26;j++)
{
char c=n.charAt(i);
if(c==first[j])
{
int pos1=j;
System.out.print(second[pos1]);
}
}
}}}
0
faseldi Messages postés 279 Date d'inscription   Statut Membre Dernière intervention   20
 
ici ton second contient qu'un char, c'est donc pas un tableau, tu peux directement print second :p
0
domxaline
 
maintenant, j'ai pb bizarre je n'arrive rien saissir
Enter the name:
apparait mais je ne peux pas saissir

import java.util.Scanner;
public class Testing5
{
public static void main(String[] args)
{
char first[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
//System.out.println("Entrez la clé");
char second = 0;
char tab[]=new char[second];
//int second;
for(char i=0;i<second;i++)
{
System.out.println("Entrez votre clé:");
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
second=str.charAt(0);
}

//char second[]={'h','y','l','u','j','p','v','r','e','a','k','b','n','d','o','f','s','q','z','c','w','m','g','i','t','x'};
//Scanner sc = new Scanner(System.in);
System.out.println("Enter the name: ");
// String n="";
String n="";
int len=n.length();
for(int i=0;i<len;i++)
{
for(int j=0;j<26;j++)
{
char c=n.charAt(i);
if(c==first[j])
{
int pos1=j;
//System.out.print(second[pos1]);
System.out.print(second);
}
}
}}}

0