Java.lang.ArrayStoreException

Senhores,

Estou com um problema durante uma execução da minha aplicação.
Ao tentar fazer o retorno de um metodo ocorre o seguinte erro:


10:52:55,125 ERROR [LogInterceptor] RuntimeException: java.lang.ArrayStoreException

Esse erro ocorre nessa linha do codigo:

return ((String[])retorno.toArray(new String[]{}));

retorno é um ArrayList.
O que eu acho que estou fazendo de errado é que estou adicionando no ArrayList os meus objetos VO.

O que eu posso fazer para que não ocorra mais esse erro?

Obrigado,

Fabiano.

[quote=FabianoPatricio]Senhores,
retorno é um ArrayList.
O que eu acho que estou fazendo de errado é que estou adicionando no ArrayList os meus objetos VO.
[/quote]

exato!! se o vc tem um array de String, vc não pode adicionar outro objeto nele!

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ArrayStoreException.html

Legal…

mas o que eu preciso é retornar uma lista de VO´s.
Exemplo:

Obj1
Nome: Teste1; Idade: 10
Obj2
Nome: Teste2; Idade: 20
Obj3
Nome: Teste3; Idade: 17

Array[Obj1,Obj2,Obj3].

Preciso retornar todos esses Obj´s.

Como posso fazer isso?

Olá,

Você pode retornar diretamente o arraylist

List retorno = new ArrayList();
		retorno.add(obj1);
		retorno.add(obj2);
		retorno.add(obj3);

return retorno;

é claro, com as devidas alterações na assinatura de seu método.

Ou se ainda quiser usar array (e tbm tem que alterar a assinatura do método)
faça

return ((ObjetoVO[])retorno.toArray(new ObjetoVO[]{}));

onde ObjetoVo o objeto que vc criou.

[]´s
Rodrigo

Olha só, não sei por quê, só sei que se você fizer assim:

return (String[])retorno.toArray(new String[0]);

funciona.
Alguém que saiba por que isso funciona assim, pelo amor de Deus, se manifeste!

[quote=Mantu]Olha só, não sei por quê, só sei que se você fizer assim:

return (String[])retorno.toArray(new String[0]);

funciona.
Alguém que saiba por que isso funciona assim, pelo amor de Deus, se manifeste![/quote]

Olá,

esse código funciona se vc quiser retornar um array de string, e seu arrayList chamado retorno tiver somente strings

Mas, no caso do colega, ele quer retornar os objetos dele, então isso não vai funcionar (e é exatamente aí onde ele fala que ocorre o erro)

Doc do método toArray
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html#toArray(T[])

[]´s
Rodrigo

Eu consegui utilizar o

 List retorno = new ArrayList();
 		retorno.add(obj1);
 		retorno.add(obj2);
 		retorno.add(obj3);
 
 return retorno;

mas na hora de colocar isso em uma pagina jsp utilizando struts eu não consigo utilizar os metodos dos meu objetos.

olá

mostre o código que vc tah usando na sua jsp para mostrar os dados

[]´s
Rodrigo

Na minha pagina jsp eu estou tentando utilizar assim:

<logic:iterate id="metricaData" name="metricaData" type="MetricaVo">

Agora como é um ArrayList, eu tenho q utilizar assim:

<logic:iterate id="metricaData" name="metricaData" type="ArrayList">

Correto?

Agora eu me perdi aqui…(Na verdade eu estou perdido em quase tudo…hehe :slight_smile: )

Na primeira linha de codigo, funciona quando é para um unico objeto, agora como são vários, não tenho ideia de como trabalhar.

valeu.

Esse codigo é o meu action:

		MetricaFormCon metricaFormCon = (MetricaFormCon)form;
			
		String[] metricaList = MetricaHelper.getMetricaList( metricaFormCon.getGrupo(), 
				metricaFormCon.getPeriodicidade());
		
		ArrayList metricaData = null;
		
		if (metricaFormCon.getPeriodicidade().equals("1")){
			metricaData = 
				MetricaHelper.getMetricaDataCon(
						metricaList, 
						metricaFormCon.getDataIni(), 
						metricaFormCon.getDataFin());
		}
		
				
		request.setAttribute("metricaList", metricaList);
		request.setAttribute("metricaConData", metricaData);

Quando eu estou no Debug, até a linha

request.setAttribute("metricaConData", metricaData);

é o ArrayList com o objetos.

Agora, para utiliza-los na pagina JSP que eu estou perdido.

valeu.

Olá,

vc pode fazer assim (nao precisa especificar o type)
aí já pode usar seu VO dentro do iterate, como no exemplo abaixo, escrevendo-o numa linha de uma tabela.

seuObj nesse caso, refere-se a cada objeto que vc colocou no ArrayList

<logic:iterate id="seuObj"  name="metricaConData">
   <tr>
     <td><bean:write name="seuObj" property="nome"/></td>
   </tr>
</logic:iterate>

[]´s
Rodrigo

Legal,

com o logic iterate eu consigo buscar os objetos que estão no ArrayList?
Porque eu estou perguntando isso.
Utilizando esse codigo que você postou aparece o seguinte erro:


‘/tiles/metricas/MetricaDadosCon.jsp’: No getter method for property periodo of bean metricaVo

mas o metodo getPeriodo existe no VO:

	public String getPeriodo() {
		return periodo;
	}

Já tentei com outros metodos e aparece o mesmo erro.
Pode ser que o nome do bean esteja incorreto?

Valeu,

Fabiano.

olá,

poderia postar o seu código?

[]´s
Rodrigo

rodrigo_gomes,

valeu pela ajuda, mas eu consegui arrumar esse erro.

Erro estava na lógica do negócio.
Acabei mudando um pouco a logica e deu certo.

Valeu,

[]'s

Fabiano.