java.lang.ArrayIndexOutOfBoundsException: -1

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

java.lang.ArrayIndexOutOfBoundsException: -1

Mensagempor raqh » Domingo Mai 10, 2009 15:57

Olá a todos,

Estou 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?

Aqui vai o meu código:


Código: Seleccionar todos
//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: Seleccionar todos
//INTERFACE STACK
public interface Stack
{
     public void push(int i);
    public int pop(); 
    public boolean isEmpty();
}


Código: Seleccionar todos
//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;
    }

}



Obrigado pela atenção.
raqh
Novato
Novato
 
Mensagens: 15
Registado: Sábado Abr 04, 2009 17:43

Mensagempor raqh » Domingo Mai 10, 2009 18:14

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 em // a forma como estava a ler string através do teclado para verem como tinha feito. Acho estranho que não funcione através do teclado.

Alguém me pode ajudar?

Obrigado.

Código: Seleccionar todos
//CLASSE POSTFIX
import java.io.*; 
 
public class Postfix 

     public static void CalculPostFix()  throws IOException
     { 
       //BufferedReader tecl = new BufferedReader(new  InputStreamReader(System.in));
   
    //System.out.println("string: ");
        //String s2 = tecl.readLine();
       
    String s2 = "5 9 8 + 4 6 * * 7 + *";

   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(); 
      } 
}
raqh
Novato
Novato
 
Mensagens: 15
Registado: Sábado Abr 04, 2009 17:43

Mensagempor _tribal_ » Domingo Mai 10, 2009 23:19

esse erro significa que estás a tentar a aceder a uma posição do array que não existe, i.e, -1 (se não estou em erro ) .

na console do java aparece a linha do erro, vê lá qual é, de certeza que nesse for, faz com que vás a uma posição do array que não existe.

Para leres do teclado, utiliza a classe Scanner:

Código: Seleccionar todos
import java.util.Scanner;

Scanner teclado = new Scanner(System.in);
String s2 = teclado.nextLine();
[/quote]
_tribal_
Membro de Ouro
Membro de Ouro
 
Mensagens: 593
Registado: Quinta Dez 01, 2005 14:05

Mensagempor vamosAeles » Segunda Mai 11, 2009 10:35

Boas,

isso é estranho pois o readLine ja não inclui o \n ou \r no fim da String quando lê de um Reader.

Tas a executar isso numa janela de comandos (dos) ou em algum IDE?

Já agora não sei se é suposto, mas se tiveres espaços no início ou no fim, penso isso pode não dar um resultado que estás à espera.

[[]]
vamosAeles
Membro de Prata
Membro de Prata
 
Mensagens: 206
Registado: Quarta Jan 04, 2006 21:29
Localização: Lisboa/Proença

Mensagempor JoKeR} » Segunda Mai 11, 2009 21:50

Experimentei o código e não vi nada de mal...

O resultado é 2075.

O mais certo é teres-te enganado e posto mais um + ou um *, porque de resto não há por onde ele errar com essa string :). A contagem vai até ao zero, só se puseres mais um dos outros 2 (+*) é que tenta aceder no -1.
JoKeR}
Membro de Prata
Membro de Prata
 
Mensagens: 305
Registado: Terça Dez 27, 2005 3:43
Localização: Cacém


Voltar para Programação

Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante

cron