1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

java.lang.ArrayIndexOutOfBoundsException: -1

Discussão em 'Programação' iniciada por araqh, 10 de Maio de 2009. (Respostas: 9; Visualizações: 2336)

  1. 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: 10 de Maio de 2009
  2. xuxaki

    xuxaki Power Member

    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: 10 de Maio de 2009
  3. 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.
     
  4. 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: 10 de Maio de 2009
  5. Baderous

    Baderous Banido

    Cá para mim tem a ver com o \n quando inseres a expressão à mão.
     
  6. Olá,

    Testei sem o n, ou seja com System.out.print em vez de System.out.println, mas também não funciona. :(
     
  7. PJTuga

    PJTuga Power Member

    Experimenta:

    Código:
    Scanner tecl = new Scanner(System.in);
            String s2 =tecl.nextLine();
    
     
  8. 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;)
     
  9. PJTuga

    PJTuga Power Member

    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!
     
  10. 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!
     

Partilhar esta Página