Java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

5 respostas
jeovane.reges

Boa tarde a todos do GUJ.

Bom pessoal estou com um problema quando tento criar uma árvore, onde cada nó filho vai ter 5 filhos.

Eu sei que esse erro acimaé gerado quando tento acessar uma posição que não existe em meu array.
No entanto, já verifiquei o meu código e não consigo visualizar aonde que estar esse erro.

Segue abaixo a minha classe onde o erro acontece.

void criaNo(No raiz, int nivel, int nivelMaximo)
    {
        indice = 0;
        if (lista.size() > indice)
        {
            for (int i = 0; i < 5; i++)
            {
                No filho = new No(lista.get(indice));
                indice++;
                raiz.filho.add(filho);

                if (nivel < nivelMaximo)
                {
                    //System.out.println("Nivel: " + nivelMaximo);
                    criaNo(raiz.filho.get(indice), nivel, nivelMaximo);
                    //nivel++;
                }
            }
        }
    }

Alguém consegue me dizer o que tem de errado para gerar tal erro?

O erro completo que aparece é o seguinte:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.rangeCheck(ArrayList.java:571)
        at java.util.ArrayList.get(ArrayList.java:349)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:61)
        at ArvoreTeste.GetOperacoes.criaArvore(GetOperacoes.java:73)
        at ArvoreTeste.GetExecuta.main(GetExecuta.java:74)
Java Result: 1

Onde na linha 61 tem a seguinte parte do código

criaNo(raiz.filho.get(indice), nivel, nivelMaximo);

Desde de já obrigado pela ajuda de todos.

Abaixo estar todo o meu código.

package ArvoreTeste;

import java.util.ArrayList;

public class GetOperacoes
{
    ArrayList<Double> lista = new ArrayList<Double>();
    int indice = 0;
    No raiz = new No(indice);
    
    public static class No
    {
        ArrayList<No> filho = new ArrayList<No>();
        double valor;

        public No(double valor) {
            this.valor = valor;
        }
    }

    //Adiciona os valores da minha lista no meu índices
    public void criaRaiz()
    {
        if (lista.size() > indice)
        {
            raiz.valor = lista.get(indice);
            indice++;
        }
    }

    //Calcula a quantidade de níveis máximo que à arvore vai ter
    public int nivelMaximo(int tamanhoLista)
    {
        //Lista com 150 elementos terei que ter 4 níveis
        int quantidadeDeNiveis = 0;

        for (int i = 1; i < tamanhoLista; i = (int) Math.pow(5, quantidadeDeNiveis))
        {
            if (tamanhoLista > i)
            {
                quantidadeDeNiveis++;
            }
        }
        return quantidadeDeNiveis;
    }

    void criaNo(No raiz, int nivel, int nivelMaximo)
    {
        indice = 0;
        if (lista.size() > indice)
        {
            for (int i = 0; i < 5; i++)
            {
                No filho = new No(lista.get(indice));
                indice++;
                raiz.filho.add(filho);

                if (nivel < nivelMaximo)
                {
                    //System.out.println("Nivel: " + nivelMaximo);
                    criaNo(raiz.filho.get(indice), nivel, nivelMaximo);
                    //nivel++;
                }
            }
        }
    }

    //Cria a árvore
    void criaArvore(ArrayList<Double> c)
    {
        lista = c;
        criaRaiz();
        criaNo(raiz, 0, nivelMaximo(c.size()));
    }

    void listaFilhos(No raiz)
    {
        for (int i = 0; i < raiz.filho.size(); i++)
        {
            System.out.println(raiz.filho.get(i).valor);
        }

        for (int i = 0; i < raiz.filho.size(); i++)
        {
            listaFilhos(raiz.filho.get(i));
        }
    }

    //Mostra os filhos de cada nó
    void mostraFilhos()
    {
        listaFilhos(raiz);
    }
}

5 Respostas

davidbuzatto

Não li seu código, mas pela excessão que está sendo lançada, você está tentando obter um valor na posição 1 de uma estrutura de dados que contém apenas um elemento (que está na posição 0).

[]'s

gabbardo

Acho q tu deveria fazer tu código assim:

void criaNo(No raiz, int nivel, int nivelMaximo)  
    {  
        indice = 0;  
        if (lista.size() > indice)  
        {  
            for (int i = 0; i < 5; i++)  
            {  
                No filho = new No(lista.get(indice));                 
                raiz.filho.add(filho);  
  
                if (nivel < nivelMaximo)  
                {  
                    //System.out.println("Nivel: " + nivelMaximo);  
                    criaNo(raiz.filho.get(indice), nivel, nivelMaximo);  
                    //nivel++;  
                }
                indice++;
            }  
        }  
    }

Tu está chamando o indice++ já no inicio antes de chamar o raiz.filho.get(indice) na recursividade.
Acho q é isso.

jeovane.reges

Fazendo algumas alterações no meu metodo que estava dando o erro, ela ficou da seguinte forma abaixo, no entanto, continua dando erro, mas um outro "erro".

Meu metodo estar assim agora

void criaNo(No no, int nivel, int nivelMaximo)
    {
        if (lista.size() > indice)
        {
            no.filhos = new ArrayList<No>(); //Alterei aqui
            for (int i = 0; i < 5; i++)
            {
                No filho = new No(lista.get(indice)); //DAR ERRO AQUI
                indice++;
                no.filhos.add(i, filho); //Alterei aqui

                if (nivel <= nivelMaximo) //Alterei aqui
                {
                    criaNo(no.filhos.get(i), nivel++, nivelMaximo); //Alterei aqui //DAR ERRO AQUI
                }
            }
        }
    }

O erro que dar é o seguinte agora

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 150, Size: 150
        at java.util.ArrayList.rangeCheck(ArrayList.java:571)
        at java.util.ArrayList.get(ArrayList.java:349)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:54)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:60)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:60)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:60)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:60) //Aparece 150 vezes
jeovane.reges
gabbardo:
Acho q tu deveria fazer tu código assim:
void criaNo(No raiz, int nivel, int nivelMaximo)  
    {  
        indice = 0;  
        if (lista.size() > indice)  
        {  
            for (int i = 0; i < 5; i++)  
            {  
                No filho = new No(lista.get(indice));                 
                raiz.filho.add(filho);  
  
                if (nivel < nivelMaximo)  
                {  
                    //System.out.println("Nivel: " + nivelMaximo);  
                    criaNo(raiz.filho.get(indice), nivel, nivelMaximo);  
                    //nivel++;  
                }
                indice++;
            }  
        }  
    }

Tu está chamando o indice++ já no inicio antes de chamar o raiz.filho.get(indice) na recursividade.
Acho q é isso.

Se eu deixar da seguinte forma que voce disse, ele dar erro antes de adicionar o indice.
Mudei meu metodo e o deixei da seguinte forma abaixo

void criaNo(No no, int nivel, int nivelMaximo)
    {
        if (lista.size() > indice)
        {
            no.filhos = new ArrayList<No>(); //Linha 51
            for (int i = 0; i < 5; i++)
            {
                No filho = new No(lista.get(indice));
                //indice++;
                no.filhos.add(i, filho);

                if (nivel <= nivelMaximo)
                {
                    criaNo(no.filhos.get(i), nivel++, nivelMaximo); //Linha 60
                }
                indice++;
            }
        }
    }

E o erro que dar caso eu deixe da seguinte forma é:

Exception in thread "main" java.lang.StackOverflowError
        at java.util.AbstractCollection.<init>(AbstractCollection.java:66)
        at java.util.AbstractList.<init>(AbstractList.java:76)
        at java.util.ArrayList.<init>(ArrayList.java:128)
        at java.util.ArrayList.<init>(ArrayList.java:139)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:51)
        at ArvoreTeste.GetOperacoes.criaNo(GetOperacoes.java:60) //Aparece várias vezes
Diguinho.Max

concordo com o davidbuzatto

vc está tentando acessar uma posição que está vazia ou nao existe no array.

Criado 19 de outubro de 2011
Ultima resposta 24 de out. de 2011
Respostas 5
Participantes 4