Como consertar um erro java.lang.ArrayIndexOutOfBoundsException: 4

to fazendo um execercio em java no trabalho e ta dando esse erro como consertar

package br.com.caelum.argentum.modelo;

import java.util.Calendar;

public final class Negociacao {
private final double preco;
private final int quantidade;
private final Calendar data;
public Negociacao(double preco, int quantidade, Calendar data) {
this.preco = preco;
this.quantidade = quantidade;
this.data = data;
}
public double getPreco() {
return preco;
}
public int getQuantidade() {
return quantidade;
}
public Calendar getData() {
return data;
}
}

package br.com.caelum.argentum.modelo;

import java.util.Calendar;

public final class Candlestick {
private final double abertura;
private final double fechamento;
private final double minimo;
private final double maximo;
private final double volume;
private final Calendar data;
public Candlestick(double abertura,double fechamento,double minimo,
double maximo, double volume, Calendar data) {
this.abertura = abertura;
this.fechamento = fechamento;
this.minimo = minimo;
this.maximo = maximo;
this.volume = volume;
this.data = data;
}
public double getAbertura() {
return abertura;
}
public double getFechamento() {
return fechamento;
}
public double getMinimo() {

return minimo;
}
public double getMaximo() {
return maximo;
}
public double getVolume() {
return volume;
}
public boolean isAlta() {
return this.abertura < this.fechamento;
}
public boolean isBaixa() {
return this.abertura > this.fechamento;
}
public Calendar getData() {
return data;
}
}

package br.com.caelum.argentum.modelo;

import java.util.Calendar;
import java.util.List;

public class CandlestickFactory {
public Candlestick constroiCandleParaData(Calendar data,
List negociacoes) {
double maximo = negociacoes.get(0).getPreco();
double minimo = negociacoes.get(0).getPreco();

double volume = 0;
// digite foreach e dê um ctrl + espaço para ajudar a
// criar o bloco abaixo!
for (Negociacao negociacao : negociacoes) {
volume += negociacao.getVolume();
if (negociacao.getPreco() > maximo) {
maximo = negociacao.getPreco();
} else if (negociacao.getPreco() < minimo) {
minimo = negociacao.getPreco();
}
}
double abertura = negociacoes.get(0).getPreco();
double fechamento = negociacoes.get(negociacoes.size()).getPreco();
return new Candlestick(abertura, fechamento, minimo, maximo,
volume, data);
}
}

package br.com.caelum.argentum.modelo;

import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

public class TesteCandlestickFactory {

public static void main(String[] args) {
	Calendar hoje = Calendar.getInstance();
	Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);
	Negociacao negociacao2 = new Negociacao(45.0, 100, hoje);
	Negociacao negociacao3 = new Negociacao(39.8, 100, hoje);
	Negociacao negociacao4 = new Negociacao(42.3, 100, hoje);
	List<Negociacao> negociacoes = Arrays.asList(negociacao1, negociacao2,
	negociacao3, negociacao4);
	CandlestickFactory fabrica = new CandlestickFactory();
	Candlestick candle = fabrica.constroiCandleParaData(hoje, negociacoes);
	System.out.println(candle.getAbertura());
	System.out.println(candle.getFechamento());
	System.out.println(candle.getMinimo());
	System.out.println(candle.getMaximo());
	System.out.println(candle.getVolume());

}

}

ai aparece esse erro
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
at java.util.Arrays$ArrayList.get(Unknown Source)
at br.com.caelum.argentum.modelo.CandlestickFactory.constroiCandleParaData(CandlestickFactory.java:22)
at br.com.caelum.argentum.modelo.TesteCandlestickFactory.main(TesteCandlestickFactory.java:18)

Você postou o código correto? Porque tentei copiar essas classes na minha IDE, mas nem compila. Não existe getVolume() na classe Negociacao, por exemplo.

Mas pelo erro você tentou acessar uma posição de algum list que não existe, na linha 22 da classe CandlestickFactory.

Por exemplo, se existe um List assim:

[59, 67, 78]

e você tenta acessar a quarta posição:

minhaLista.get(3)

Dá o erro ArrayIndexOutOfBoundsException porque não existe a quarta posição (índice 3) só tem até a terceira posição (índice 0, 1 e 2).

siim copiei o codigo do jeito que esta la
mas o getVolume() pode ir para a classe Negociacão

Acabei editando a resposta depois de você ter postado. Vê se com o que eu acrescentei nesse meu comentário acima te ajuda.

mas pelo que vi no codigo
double abertura = negociacoes.get(0).getPreco();
ele pega a posição zero que existe na lista

O índice 0 significa o primeiro elemento da List. Se dá esse erro ao tentar pegar o primeiro elemento, então significa que esse elemento está vazio.

double fechamento = negociacoes.get(negociacoes.size()).getPreco();
o erro ta aqui pois o negociacoes.size pega o tamanho da lista e nao a ultima posição logica

Se descobriu a linha que dá o problema, então o resto é fácil corrigir :wink:

Colega, o vídeo postado não ajuda a encontrar a solução para o problema postado. :frowning:

Meu caro @juliooliveira, quando for postar algum código fonte, selecione todo o código na caixa de texto e depois aperte no ícone “</>” daí o texto irá ficar formatado como código fonte e ficará mais legível de se ler. Percebo que você é novo aqui no fórum. Seja bem-vindo, e leia esse tópico aqui por gentileza: