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

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.

[code]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++;
            }
        }
    }
}[/code]

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.

[code]package ArvoreTeste;

import java.util.ArrayList;

public class GetOperacoes
{
ArrayList lista = new ArrayList();
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);
}

}
[/code]

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

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.

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

[code] void criaNo(No no, int nivel, int nivelMaximo)
{
if (lista.size() > indice)
{
no.filhos = new ArrayList(); //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
            }
        }
    }
}[/code]

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

[quote=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.[/quote]

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

[code]void criaNo(No no, int nivel, int nivelMaximo)
{
if (lista.size() > indice)
{
no.filhos = new ArrayList(); //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++;
        }
    }
}[/code]

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

concordo com o davidbuzatto

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