Problema com java.lang.StackOverflowError

8 respostas
J

Hi,

Estou com um problema de java.lang.StackOverflowError.

Utilizo uma base de dados exemplo de hsql e a hibernate 3. O resultado obtido da lógica utilizada vem sempre como list, ou seja collections, que passo para o flash. Tenho os mapeamentos feitos e desde que as relações sejam unidirectionais tudo funciona bem. O problema que me acontece é quando tenho relações bidireccionais. Nesse caso quando passo os dados para o flash obtenho o problema de StackOverflowError, pois não consegue fazer o serialize da collection.
Resolvi isto, modificando a declaração do set da relação, adicionando transient. Nesse caso, o java não faz o serialize do set, e os dados, exceptuando o set, estão visiveis no flash.

A questão que coloco é se esta é a melhor maneira para resolver este problema. Se não for façam sugestões, por favor.

Agradeço desde já qualquer ajuda disponibilizada.

8 Respostas

louds

Já examinou o stacktrace do Error? Verificou o que está causando estouro na pilha? Sem isso não tem como pensar em outra solução.

J

O flash remoting não sabe interpretar o Serialize, e é o flash que faz com que estoure a pilha.

Quando eu coloco transiente, o programa não faz o serialize e o flash já funciona bem.

louds

jbrites, tente ser mais claro. Parece que você tem um atributo não serializavel na tua classe e está tentando serializar ela. Não vai funcionar.

J

Hi,
Antes de mais, obrigado por tentares ajudar.

Vou tentar ser mais específico para clarificar o problema em causa.

Li uns artigos sobre o hibernate, e comecei a fazer testes pois gostei das ideias implementadas pelo hibernate. Neste momento, tenho uma base de dados oracle e utilizo o hibernate 3. Toda a lógica do programa está em Java e os resultados obtidos resultam da interacção do hibernate com a base de dados Oracle, estando sempre os resultados guardados no tipo List que depois são enviados para o flash onde serão apresentados. Falta dizer que pelo meio está um servidor aplicacional que é o jrun.

Apresentada a estructura do programa, apresento agora o problema do serialize. Tenho relações bidirecionais, o que implica ter Set’s para guardar os objectos que estão relacionados. Tenho então num objecto, e para além dos seus dados, as collections de objectos relacionados.

Posteriormente estes dados são enviados para o flash, e quando o flash está a ler os dados (serialize) o flash confunde-se (penso eu) e a stack estoura.

Se não fizer o serialize, ou retirar a relação bidireccional o programa funciona bem.

Resumindo, a dificuldade está em o flash ler os objectos que contêm colections.

Quando executo apenas o java sem ser passar os dados para o flash, o programa funciona bem, com ou sem relações bidireccionais. Nesta situação, não tenho é a parte gráfica da aplicação.

Obrigado pelas sugestões.

cv1

Joao, o que voce esta colocando dentro das Lists?

louds

Pergunta boba, não conheço como funciona o flex, mas tuas classes implementam Serializable?

J

Hi,
Finalmente consegui entender o que se está a passar. Apenas posso passar classes para o flash que sejam serializable. Eu nas minhas classes que mapeiam as tabelas da base de dados tenho relações bidirecionais o que implica ter objectos com instâncias de outros, isto é, se tenho um erro, tenho uma relação para o pedido que deu erro (instância do pedido na classe do erro) e na classe pedido tenho um set de erros. Quando faço “from ERROS” o hibernate dá-me toda a informação do erro, que inclui uma instância do pedido e, passo para o flash. O flash consegue ler todos os parâmetros, excepto quando chega ao parâmetro que é a instância do pedido; nesta altura o flash não sabe o que fazer e o programa dá erro.

Percebido isto, tenho de enterder o porquê do flash remoting não gostar de objectos que contenham objectos, pode ser uma limitação.

Pessoal, muito obrigado pelas vossas dicas, elas foram importantes.

Um abraço e,

juceliohv

O meu caso era parecido, eu tenho um método que gera uma tabela de erros, porém coloquei por engano uma chamada para ela mesma, ou seja, entrou em loop infinito e gerando List<>.

Quando retirei a chamada recursiva resolveu o problema.

Criado 28 de abril de 2005
Ultima resposta 19 de jul. de 2011
Respostas 8
Participantes 4