Erreur Java

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!

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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 sur
    while (PILE.voir() != "(")
    car il ne faut jamais comparer un String avec == ou != mais avec la méthode equals.
    1
    1. El talhaoui
       
      D'accord merci pour le equals, je vais essayer ca. Si ca ne fonctionne toujours pas je vais poster tout mon code. Merci
      0
  2. El Talhaoui
     
    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
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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 fait
      for(int i=1;i<=expression.length();i++)
      or les indices en Java commence à 0, il faut faire
      for(int i=0;i<expression.length();i++)
      sinon tu vas avoir des StringIndexOutOfBoundsException lorsque i=expression.length()
      0
    2. El Talhaoui
       
      D'accord merci, je vais tester ça !
      0