Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1

11 respostas
java
A

Estou com sério problema no meu código. Quando, dentro do comando de repetição while, peço para repetir mais e 5 vezes, aparece a seguinte mensagem:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: -1
e aponta para a seguinte seguinte linha dentro do código : custo = matriz.get(mediana-1).get(j);

Não sei como resolver isso, alguém pode me ajudar nessa?

Desde já agradeço.

for (int j=0; j<tamanho_instancia; j++)
{
    mediana = Individuo_avaliado_capacidade.get(j);  //mediana que atende o vértice.
    custo = matriz.get(mediana-1).get(j); // custo da distância de mediana para j.
    fo = fo + custo;
}

11 Respostas

L

Pense nessa lista com os seguintes números e suas respectivas posições nessa mesma lista:

lista -> [ 1 , 2 , 3 , 4 , 5 ]
           0   1   2   3   4  <- posições dos itens

O número 1 está na posição 0 da lista e o número 5 está na posição 4.

Se eu fosse acessar, via código java, essa estrutura dessa forma:

int numero = lista.get(5);

Isso iria causar o erro: java.lang.ArrayIndexOutOfBoundsException, pois não existe a posição 5 na lista, sendo que ela vai somente até a posição 4.

Entendeu?

Esse erro indica um problema na lógica da aplicação e, para resolver, você precisará rodar seu código em modo de depuração para encontrar onde está o erro na lógica.

A

Oi lucastody, muito obrigado pela atenção! Então, fiz o debug em todo parte do código e erro não aparece, somente quando mando rodar com repetição acima de 5. Tenho um while que precisa executar essa tarefa no mínimo 100 vezes, pois o que estou rodando é um algoritmo de otimização (Algoritmo Genético). Se mudo para while(parada < 5) ele roda sem problema, porém, quando faço while(parada < 6) ele não roda e aparece o erro indicando a linha de comando "custo = matriz.get(mediana-1).get(j); " Anexei o código que faz isso com o respectivo erro. Desde já obrigado

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: -1

  • Avalia fo -

at java.util.ArrayList.elementData(ArrayList.java:418)

package ag_pmpc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class AG_PMPC_Avalia_fo {
    
    public static float avalia(ArrayList<Integer> Individuo_avaliado_capacidade, int tamanho_instancia, ArrayList<ArrayList<Float>> matriz) 
        
        float custo = 0;
        float fo =0;
        int mediana =0;
        int indice =0;
         
        for (int j=0; j<tamanho_instancia; j++){
            mediana = Individuo_avaliado_capacidade.get(j);  //mediana que atende o vértice.
            custo = matriz.get(mediana-1).get(j); // custo da distância de mediana para j.
            fo = fo + custo;
        }     
        
        System.out.println("\nfo");
        System.out.println(fo);
        
    
        return  fo;
    }
}
L

Na lógica da sua aplicação, qual a diferença em colocar o while como parada < 5 e parada < 6 ? O que implica essa variável parada? Pq 5 ou 6?

A

Oi Lucas,
Na verdade o critério de parada é while(parada < tamanho_populacao). Sendo que o tamanho mínimo para a população é 100. Porém, se coloco o tamanho da população com 5, o código roda, acima disso dá pau.
Estou sem entender porque disso, se o tamanho_população estiver acima de 5 ele não roda e dá o erro que descrevi anteriormente.
Valeu!!!

D

na linha onde está: Individuo_avaliado_capacidade.get(j);, deve estar retornando zero. Se mediana for zero, mediana-1 será igual a -1 e matriz.get(-1) talvez não seja possível.

vc pode verificar da seguinte forma:

for (int j=0; j<tamanho_instancia; j++){
	mediana = Individuo_avaliado_capacidade.get(j);  //mediana que atende o vértice.
	System.out.println("mediana:" + mediana + " para j:" + j);
	custo = matriz.get(mediana-1).get(j); // custo da distância de mediana para j.
	fo = fo + custo;
}

Se imprimir "mediana: 0 para j: x" (x pode ser qualquer valor), então o problema deve ser no matriz.get(mediana-1).

A

diego12, muito obrigado pelo retorno! Cara, foi exatamente isso que você disse, veja que a última mediana recebeu 0 (zero) para j=8.

Agora, como você postou, se o Individuo_avaliado_capacidade.get(j);, estiver retornando zero, mediana-1 será igual a -1. Isso quer dizer que individuo_avaliado_capacidade possui um elemento 0(zero)?

Obrigado!

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: -1

  • Avalia fo -
    mediana:5 para j:0
    mediana:2 para j:1
    mediana:8 para j:2
    mediana:8 para j:3
    mediana:5 para j:4
    mediana:8 para j:5
    mediana:2 para j:6
    mediana:8 para j:7
    mediana:0 para j:8
    at java.util.ArrayList.elementData(ArrayList.java:418)
    at java.util.ArrayList.get(ArrayList.java:431)
    at ag_pmpc.AG_PMPC_Avalia_fo.avalia(AG_PMPC_Avalia_fo.java:34)
    at ag_pmpc.AG_PMPC_Pop_Inicial.AG_populacao_inicial(AG_PMPC_Pop_Inicial.java:31)
    at ag_pmpc.AG_PMPC_Principal.ag(AG_PMPC_Principal.java:116)
    at ag_pmpc.AG_PMPC.main(AG_PMPC.java:17)
    Java Result: 1
    CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
A

Consegui resolver o problema com um simples “if”

if (mediana !=0){
            System.out.println("mediana:" + mediana + " para j:" + j);
            custo = matriz.get(mediana-1).get(j); // custo da distância de mediana para j.
            fo = fo + custo;
        }

Obrigado a todos que me ajudaram!!!

A

Olá Diego,

estou com um problema que é o seguinte: Meu código começa a rodar e de repente aparece a seguinte mensagem:

Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

at java.util.ArrayList.rangeCheck(ArrayList.java:653)

at java.util.ArrayList.get(ArrayList.java:429)

at ag_pmpc.AG_PMPC_Atendido_Capacidade.Soma_demandas(AG_PMPC_Atendido_Capacidade.java:174)

at ag_pmpc.AG_PMPC_Atendido_Capacidade.atendido_capacidade(AG_PMPC_Atendido_Capacidade.java:122)

at ag_pmpc.AG_PMPC_Principal.ag(AG_PMPC_Principal.java:186)

at ag_pmpc.AG_PMPC.main(AG_PMPC.java:17)

O erro apontado está dentro desse for no if ( if(individuo_capacitado.get(j) == med ) { )

Segue parte do código:

for (int i=0; i < aux_numero_medianas; i++){

med = aux_medianas.get(i); // variável med recebe a mediana.

soma_demanda =0;
for (int j=0; j < aux_tamanho_instancia; j++){
            
            if(individuo_capacitado.get(j) == med ){

                soma_demanda = soma_demanda + aux_demandas.get(j);
            }
            else{
               // continue;
            }
        }
        aux_demandas_clusters.add(soma_demanda);

Obrigado por me ajudar!

D

Significa que o tamanho é zero e está tentando acessar o elemento no índice zero.

o individuo_capacitado é um ArrayList que provavelmente está vazia ao tentar acessar o acessar o elemento no índice zero pelo método get.

A

Olá Diego, mais uma vez muito obrigado pela ajuda!

É isso mesmo, o indivíduo estava vazio, agora não entendi, porque sempre carrego o individuo_capacitado com um Individuo passado para a classe. - individuo_capacitado.addAll(Individuo); -

Em alguns momentos ele funciona, em outros não. Observei que é aproximadamente na 15ª geração que ele dá o erro. Daí conseguir “tratar” gerando o indivíduo novamente quando ocorre o erro.

  • if(individuo_capacitado.size() == 0){
    individuo_capacitado =
    AG_PMPC_Gera_Individuos_Aleatorios.gera_individuo(tamanho_instancia, numero_medianas, demanda, matriz, capacidade);
    } -

Agora,

tenho que gerar 80 indivíduo e armazená-los no ArrayList populacao_inicial - ArrayList populacao_inicial= new ArrayList<>(); -

Entretanto, quando o individuo é introduzido na populacao_inicial, ele sobrepõe os demais que já estão lá dentro, ou seja, quando chega ao final os 80 indivíduos estão todos iguais.

public class AG_PMPC_Pop_Inicial {

public static ArrayList AG_populacao_inicial(int tamanho_instancia, int

numero_medianas, int[]demanda, int[]coord_x, int []coord_y,ArrayList<ArrayList>

matriz,int[]capacidade, int tamanho_populacao){//, int [] demanda, int[] coord_x, int []coord_y, int capacidade){

float fo_Individuo= 0;
int criterio_parada = 0;
    ArrayList<ArrayList> populacao_inicial= new ArrayList<>();
        while(criterio_parada < tamanho_populacao){
            ArrayList<Integer> Individuo = new ArrayList<>(tamanho_instancia);
            Individuo = AG_PMPC_Gera_Individuos_Aleatorios.gera_individuo(tamanho_instancia, 
             numero_medianas, demanda, matriz, capacidade);
            fo_Individuo = AG_PMPC_Avalia_fo.avalia(Individuo, tamanho_instancia, matriz);
            populacao_inicial.add(Individuo);
            criterio_parada++;
    }
    return populacao_inicial;
}

}

D

Provavelmente na linha onde está:

Individuo = AG_PMPC_Gera_Individuos_Aleatorios.gera_individuo(tamanho_instancia, 
             numero_medianas, demanda, matriz, capacidade);

esteja retornando o mesmo indivíduo.
Verifique o método e os parâmetros passados pelo método.
Observe que os parâmetros são sempre o mesmo a cada loop.

Criado 14 de julho de 2017
Ultima resposta 21 de jul. de 2017
Respostas 11
Participantes 3