java.lang.ArrayIndexOutOfBoundsException: -1

araqh

Membro
Olá a todos,
Estou mais uma vez a precisar da vossa preciosa ajuda...
Trata-se de um programa que recebe uma expressão em postfix e retorna o resultado (ou deveria retornar...)
Quando na execução ponho 5 9 8 + 4 6 * * 7 + *, ele retorna uma excepção:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at PilhaArray.pop(PilhaArray.java:
at Postfix.CalculPostFix(Postfix.java:
at Postfix.main(Postfix.java:

De onde vem o problema?:confused:

Aqui vai o meu código:

Código:
//CLASSE POSTFIX
 import java.io.*;  
   
 public class Postfix  
 {  
     public static void CalculPostFix(String s2)  
     {  
         PilhaArray s = new PilhaArray ();    
           
         for (int i = 0; i < s2.length(); i += 2)  
        {  
             if (s2.charAt(i) == '+')  
                 s.push(s.pop() + s.pop());  
             else if (s2.charAt(i) == '*')  
                 s.push(s.pop() * s.pop());  
             else  
             {  
                int num = 0;  
                 do  
                 {  
                     num = num*10 + s2.charAt(i)-'0'; // Constrói número  
                     ++i;  
                 }  
                 while (s2.charAt(i) != ' ');  
                 --i;  
                 s.push(num);  
             }  
         }  
           
         System.out.println(s.pop());  
     }  
       
  
       public static void main(String[] args) throws IOException  
      {  
       BufferedReader stdr = new BufferedReader(new InputStreamReader(System.in));  
     
        String line = stdr.readLine();      
        CalculPostFix(line);  
      }  
 }
Código:
//INTERFACE STACK
public interface Stack
{
     public void push(int i);
    public int pop();  
    public boolean isEmpty();
}
Código:
//CLASSE PILHAARRAY
public class PilhaArray implements Stack
{
    private int[] stack;
    private int n;
    
    public PilhaArray()
    {
        stack = new int[1000000];
        n=-1;
    }
    
    
    public boolean isEmpty()
    {
        return n == -1;
    }
    
    
    public void push(int item)
    {
        if (n < stack.length)
        {
            stack[++n] = item;
        }
    }
    

    public int pop() {
        
        int item = stack[n--];
        return item;
    }

}
Desde já obrigada pelas respostas.
 
Última edição:
Não tive tempo de ver o código com muita atenção, mas o problema é óbvio. Estás a tentar aceder à posição -1 do teu objecto PilhaArray, que obviamente não existe.
Tem em atenção aos incrementos e decrementos da tua variável n na class PilhaArray, ou seja, dos pop e push que fazes.
 
Última edição:
Olá! Obrigada.

Sei a que se deve essa excepção, não estou é a conseguir corrigir, estou sempre a modificar mas obtenho sempre a mesma coisa... Tenho noção de que é básico. Noutras situações mais evidentes para mim, quando tinha essa excepção, consegui ver logo onde estava o erro.

Se alguém souber o que tenho que corrigir, por favor não hesite. A mínima ajuda será certamente bastante util.

Obrigada pela atenção.
 
Modifiquei a classe postfix, de forma a integrar a string "5 9 8 + 4 6 * * 7 + *" no código em vez de a ler através do teclado....e para meu espanto já não retorna aquela excepção! Pus a verde a forma como a estava a ler através do teclado. Quando ponho através do teclado 2 3 *, já funciona, mas como disse se puser 5 9 8 + 4 6 * * 7 + *, ele retorna a excepção:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at PilhaArray.pop(PilhaArray.java:
at Postfix.CalculPostFix(Postfix.java:
at Postfix.main(Postfix.java:

Alguém me pode ajudar?

Obrigado.

Código:
[COLOR=DarkOrange]//CLASSE POSTFIX[/COLOR]
[COLOR=DarkOrange] import java.io.*;  
   
 public class Postfix  
 {  
     public static void CalculPostFix()  throws IOException
     {  [/COLOR]
   [COLOR=Green] //BufferedReader tecl = new BufferedReader(new InputStreamReader(System.in)); 
     
    //System.out.println("string: ");
        //String s2 = tecl.readLine();  [/COLOR]
         
  [COLOR=DarkOrange]  [COLOR=Yellow]String s2 = "5 9 8 + 4 6 * * 7 + *"; 

[/COLOR]    char[] a = s2.toCharArray(); 
         
    PilhaArray s = new PilhaArray ();    
           
         for (int i = 0; i < s2.length(); i += 2)  
        {  
             if (a[i] == '+')  
                 s.push(s.pop() + s.pop());  
             else if (a[i] == '*')  
                 s.push(s.pop() * s.pop());  
             else  
             {  
                int num = 0;  
                 do  
                 {  
                     num = num*10 + a[i]-'0'; // Constrói número  
                     ++i;  
                 }  
                 while (a[i] != ' ');  
                 --i;  
                 s.push(num);  
             }  
         }  
           
         System.out.println(s.pop());  
     }  
       
  
       public static void main(String[] args) throws IOException  
      {  
        CalculPostFix();  
      }  [/COLOR]
 }
 
Última edição:
Experimenta:

Código:
Scanner tecl = new Scanner(System.in);
        String s2 =tecl.nextLine();

Olá. Infelizmente também não dá :(. Eu esqueci-me de dizer uma coisa importante e aliás já editei a mensagem que deixei ( a que tem o codigo a laranja). Como disse, através do teclado se eu puser a expressão 5 9 8 + 4 6 * * 7 + * ele retorna uma excepção, mas se eu puser uma expressão mais curta como por exemplo 2 3 *, já funciona, ele retorna 6 como previsto....

Alguem sabe o que tenho de modificar?

Obrigada;)
 
Criei o projecto com as classes que colocaste no 1º post e tudo funciona sem problemas!
Usei o NetBeans IDE 6.1 para criar o projecto...

fiz os calculos manualmente e no programa e parece que está tudo a funcionar


EDIT: apenas dá o erro java.lang.ArrayIndexOutOfBoundsException: -1 se eu meter uma expressão errada!
 
Pois é, o código está correcto...Acabei de descobrir porquê que me estava sempre a retornar essa excepção para a expressão longa ( 5 9 8 + 4 6 * * 7 + *) que dei como exemplo e não para a curta (2 3 *)
É que para a primeira como é mais longa e a tinha num outro ficheiro, fiz sempre copiar colar para a testar, em vez de inserir tudo com o teclado.... Assim que o fiz funcionou. :wscared:
Isto tudo por causa de um copiar colar :D Desculpem ter incomodado.
Obrigado a todos pelas respostas!
 
Back
Topo