Erro de index out of bound :(

5 respostas
K

Fala ae pessoal, a conta é nova mas smp visitava o GUJ e essa foi a primeira vez q precisei postar algo pra tirar uma dúvida... :?

Me passaram um desafio, que eu ja havia feito em C, que era fazer uma funcao recursiva que retornasse a string na ordem ao contraria. Fui faze-la em Java de uma maneira um pouco diferente só que esta ocorrendo erro de out of bound que eu nao consegui achar direito... Deem uma olhada pra mim por favor?

Essa é a classe que contem a lista e o metodo recursivo pra inverter a lista.
public class Lista {
    int qtde = 5;
    public String x[] = new String[qtde];


    public String[] getX() {
        return x;
    }

    public void setX() {
        this.x[0] = "Oi";
        this.x[1] = "5";
        this.x[2] = "1/1/2005 14:00:00";
        this.x[3] = "1.5";
        this.x[4] = "Tchau";

    }


    public int inverteLista (int test) {
        String aux = "";

        
        int pos = x.length - (test - 1);

        if (test < x.length) {
            aux = x[test];
            test++;
            if (inverteLista(test) == 0) {
                x[pos] = aux;
            }
        }

        return 0;
    }

}
Essa é a main... nao sei se serve de alguma coisa :) :
public class Desafio {

    public static void main(String[] args) {
        Lista lista = new Lista();
        lista.setX();
        lista.inverteLista(0);
        System.out.println ( lista.x[0] );
        System.out.println ( lista.x[1] );
        System.out.println ( lista.x[2] );
        System.out.println ( lista.x[3] );
        System.out.println ( lista.x[4] );
    }
}

Desde ja agradeco a todos ^^

5 Respostas

cledson2011

Amigo você errou na linha 26 da classe lista if (test < x.length) é só você trocar o sinal de menor(<) pelo sinal de maior(>) que funciona , você está estourando as bordas do vetor .

ribclauport

O problema é na variável "pos", quando o método retorna "0" para a ultima chamada recursiva sua variável vai estar com o valor "1", mais como o método ja foi "desempilhado", a primeira atribuição vai usar o valor "2", para a variável, sendo assim quando chegar na posição "5", não existe esse índice para o vetor,

abaixo uma das possíveis soluções para seu problema, na verdade foi só retirar 2 da variável pos

public int inverteLista (int test) {  
        String aux = &quot;&quot;;  
  
          
        int pos = x.length - (test - 1);  
  
        if (test &lt; x.length) {  
            aux = x[test];  
            test++;  
            if (inverteLista(test) == 0) {  
                x[pos-2] = aux;  //aqui foi feita a alteração para iniciar com 0
            }  
        }  
  
        return 0;  
    }  
}

Saída:

Tchau
1.5
1/1/2005 14:00:00
5
Oi

Espero ter ajudado.

ribclauport

Se for feito isso, não vai entrar alguma vez, no if, pois 0>5 vai dar false e o algoritmo não vai funcionar.

ribclauport

Para ficar mais bacana mude na linha cinco para o codigo abaixo:

int pos = (x.length-1) - (test);

Pois desta forma na “condição de guarda”, o ultimo valor será -1, e para o próximo método, estará o valor de pos igual a “0”, desta forma acredito que realmente, a mudança será efetuada na linha “correta”.

K

Isso! Me desculpem eu tinha acabado de encontrar o erro aqui tbm, mto obrigado cledson2011 e ribclauport, foi exatamente isso que eu fiz rib!
Agora só por curiosidade, vendo o código, que é pra inverter a ordem de um array de string, sem usar outro array ou matriz… vcs fariam de outra forma?

Criado 25 de março de 2012
Ultima resposta 25 de mar. de 2012
Respostas 5
Participantes 3