2017-10-11 2 views
-2

Comment puis-je gérer EmptyStackException pour ce bloc de code? Montre que ma pile est vide après avoir lu une partie du fichier. Je devine que cela a à voir avec les méthodes push() et pop() mais pas complètement sûr.EmptyStackException pour une pile non vide

Stack<Integer> stack = new Stack<Integer>(); 
    int op1, op2, result = 0; 
    String token; 
    StringTokenizer tokenizer = new StringTokenizer(expr); 

    while (tokenizer.hasMoreTokens()) { 
     token = tokenizer.nextToken(); 
     char c = token.charAt(0); 
     if (isOperator(c)) { 
      op2 = ((Integer) stack.pop()).intValue(); 
      op1 = ((Integer) stack.pop()).intValue(); 
      result = evalSingleOp(token.charAt(0), op1, op2); 
      stack.push(new Integer(result)); 

     } else { 
      stack.push(new Integer(Integer.parseInt(token))); 

     } 

    } 

    result = ((Integer) stack.pop()).intValue(); 
    return result; 
} 
+1

"Dit que ma pile est vide quand elle ne l'est pas." Donc vous appelez le runtime Java un menteur? Bien sûr, cela a à voir avec 'push()' et 'pop()'. Ce sont les seules choses qui manipulent la pile. Soit vous recevez une mauvaise entrée, soit vous avez une erreur de logique. Montrer plus d'effort. – Kayaman

+0

C'est simple. Vous commencez avec une pile vide, puis le programme saute la boucle while car il n'y a pas de jetons dans l'entrée, alors vous essayez de faire apparaître la pile mais il n'y a rien là. S'il y a vraiment des jetons dans l'entrée, ** pourquoi les caches-tu? ** – ajb

+2

Aussi, où se produit l'exception? Vous n'avez pas montré la pile, ce qui est la chose la plus importante à montrer quand vous avez une exception. – Kayaman

Répondre

0

L'exception est due DÉCOULANT aux lignes de code ci-dessous.

op2 = ((Integer) stack.pop()).intValue(); 
op1 = ((Integer) stack.pop()).intValue(); 

Au cours de la première itération de la boucle si le premier caractère du « expr » est un opérateur alors la condition à l'intérieur si devient vrai

if (isOperator(c)) //true 

Mais puisqu'il est la première itération, La pile n'a aucun opérande à faire apparaître.

Le code ci-dessus fonctionne bien pour « Expr » tels que 1 2 + ayant suffisamment opérandes avant que les opérateurs, mais pas pour « expr » tels que + 1 2 qui n'a pas assez (2) opérandes avant un opérateur.

-1

je suppose, vous devriez vérifier stack.length avant stack.pop()

+1

Ce n'est pas une réponse, mais un commentaire (ou est-ce une réponse? Si c'est le cas, c'est faux et mauvais). – Kayaman