Erreur Java
El Talhaoui
-
El Talhaoui -
El Talhaoui -
Bonjour, j'ai un projet a faire pour mon cours de programmation structure de donnés. Je dois créer un programme qui ou l'on demande a l'utilisateur de rentrer une équation sous la forme infixe et je dois la changer en forme suffixée.
Voici mon programme ... :
public static void main(String[] args) throws Exception {
String expSuffixe;
String expInfix= JOptionPane.showInputDialog("Entrez une expression infixée");
ConvertisseurInfixeEnSuffixe exp= new ConvertisseurInfixeEnSuffixe(expInfix);
expSuffixe= exp.convertirEnSuffixe(expInfix);
System.out.print(expSuffixe);
}
public class ConvertisseurInfixeEnSuffixe {
private Pile PILE;
private String expression = "";
private String Suffixe="";
private int operande= 0;
public ConvertisseurInfixeEnSuffixe(String expression) {
super();
this.expression = expression;
}
public String convertirEnSuffixe(String expression) {
pileGenerique.Pile PILE = new pileGenerique.Pile ();{
PILE.empiler("(");
expression= expression +")";
while (! (PILE.vide())){
for(int i=1;i<=expression.length();i++){
if (estUnEntier(expression.charAt(i))== false){
Suffixe +=Character.toString(expression.charAt(i));
} else if (expression.charAt(i)=='('){
PILE.empiler(expression.charAt(i));
}
else if (estUnOperateur(expression.charAt(i))==true){
Suffixe +=Character.toString(expression.charAt(i));
PILE.empiler(expression.charAt(i));
}
else if (expression.charAt(i)==')'){
while( PILE.voir() != "("){
Suffixe +=(String) PILE.depiler();
}
PILE.depiler();
}
}
}
}
return (String) Suffixe;
}
public boolean estUnOperateur( char operateur){
switch( operateur){
case '+':
return true;
case '-':
return true;
case '*':
return true;
case '/':
return true;
default :
return false;
}
public boolean estUnEntier(char c) {
try {
Character.getNumericValue(c);
} catch (NumberFormatException e){
return false;
}
return true;
}
}
}
Maintenant, le problème c'est que quand je lance le programme, ça me donne cette erreur:
Exception in thread "main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String
at expressionsInfixes.ConvertisseurInfixeEnSuffixe.convertirEnSuffixe(ConvertisseurInfixeEnSuffixe.java:40)
at TestProgramme.main(TestProgramme.java:29)
Quelqu'un peut m'aider ? Merci!
Voici mon programme ... :
public static void main(String[] args) throws Exception {
String expSuffixe;
String expInfix= JOptionPane.showInputDialog("Entrez une expression infixée");
ConvertisseurInfixeEnSuffixe exp= new ConvertisseurInfixeEnSuffixe(expInfix);
expSuffixe= exp.convertirEnSuffixe(expInfix);
System.out.print(expSuffixe);
}
public class ConvertisseurInfixeEnSuffixe {
private Pile PILE;
private String expression = "";
private String Suffixe="";
private int operande= 0;
public ConvertisseurInfixeEnSuffixe(String expression) {
super();
this.expression = expression;
}
public String convertirEnSuffixe(String expression) {
pileGenerique.Pile PILE = new pileGenerique.Pile ();{
PILE.empiler("(");
expression= expression +")";
while (! (PILE.vide())){
for(int i=1;i<=expression.length();i++){
if (estUnEntier(expression.charAt(i))== false){
Suffixe +=Character.toString(expression.charAt(i));
} else if (expression.charAt(i)=='('){
PILE.empiler(expression.charAt(i));
}
else if (estUnOperateur(expression.charAt(i))==true){
Suffixe +=Character.toString(expression.charAt(i));
PILE.empiler(expression.charAt(i));
}
else if (expression.charAt(i)==')'){
while( PILE.voir() != "("){
Suffixe +=(String) PILE.depiler();
}
PILE.depiler();
}
}
}
}
return (String) Suffixe;
}
public boolean estUnOperateur( char operateur){
switch( operateur){
case '+':
return true;
case '-':
return true;
case '*':
return true;
case '/':
return true;
default :
return false;
}
public boolean estUnEntier(char c) {
try {
Character.getNumericValue(c);
} catch (NumberFormatException e){
return false;
}
return true;
}
}
}
Maintenant, le problème c'est que quand je lance le programme, ça me donne cette erreur:
Exception in thread "main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String
at expressionsInfixes.ConvertisseurInfixeEnSuffixe.convertirEnSuffixe(ConvertisseurInfixeEnSuffixe.java:40)
at TestProgramme.main(TestProgramme.java:29)
Quelqu'un peut m'aider ? Merci!
2 réponses
-
Vu qu'on a pas tout ton code on ne peux pas tester, et comme on n'a pas non plus les numéros de lignes pour savoir à quoi correspond les lignes 29 et 40, c'est dur de retrouver l'erreur, d'autant que je doute que ce soit la seule.
En particulier quelles données manipules PILE ?
Si tu fais(String) PILE.depiler()
il faut être sûr que c'est bien un String qui t'es renvoyé, si c'est un char, tu auras l'erreur décrite : Character cannot be cast to String
En tout cas tu auras un problème surwhile (PILE.voir() != "(")car il ne faut jamais comparer un String avec == ou != mais avec la méthode equals. -
Bon, pour le equals ça fonctionne, maintenant j'ai d'autres erreurs...
voici ma classe Pile
package pileGenerique;
public class Pile<E> {
private int maxElements=1000;
private E elements[];
private int sommet;
public Pile() {
elements = (E[ ]) new Object[maxElements];
sommet = -1;
}
public void empiler(E nouvElem) {
if (sommet == (maxElements-1)) {
System.out.println("Desole, la pile est pleine!");
} else {
//on empile l'élément
sommet = sommet + 1;
elements[sommet] = nouvElem;
}
}
public E depiler() {
if (sommet < 0) {
System.out.println("Errreur: la pile est vide, on ne peut pas depiler!");
return (E) null;
} else {
E elemDuHaut = (E) elements[sommet];
sommet = sommet - 1;
return elemDuHaut;
}
}
public boolean vide(){
return sommet==-1;
}
public E voir(){
return(E) elements[sommet];
}
public String sommet(){
E elemDuHaut = elements[sommet];
sommet = sommet - 1;
return (String) (elemDuHaut);
}
}
Maintenant , j'ai cette erreur:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 4
at java.lang.String.charAt(Unknown Source)
at expressionsInfixes.ConvertisseurInfixeEnSuffixe.convertirEnSuffixe(ConvertisseurInfixeEnSuffixe.java:28)
at TestProgramme.main(TestProgramme.java:28)
La ligne 28 dans TestProgramme c'Est :
expSuffixe= exp.convertirEnSuffixe(expInfix);
et la ligne 28 dans ConvertisseurInfixeEnSuffixe c'est :
if (estOperande(expression.charAt(i))){
Suffixe +=Character.toString(expression.charAt(i));
Je n'ai aucune erreur dans le code, c'Est juste quand je le lance que ça me donne ces erreurs. Pour les anciennes erreurs, la ligne 40 c'était
while (PILE.voir() != "(")
Merci-
Vu que tu as défini une Pile<E> je commencerais déjà par déclarer
pileGenerique.Pile<String> PILE = new pileGenerique.Pile<String> ();
afin de spécifier que c'est bien des String que tu manipules ce qui évites d'avoir à faire tes casts(String)
un peu partout dans ton code...
Sinon pour ton erreur c'est parce que tu as faitfor(int i=1;i<=expression.length();i++)
or les indices en Java commence à 0, il faut fairefor(int i=0;i<expression.length();i++)
sinon tu vas avoir des StringIndexOutOfBoundsException lorsque i=expression.length() -
-