Problema com StackOverflowError

5 respostas
I

fala pessoal blz??? estou com um pequeno problema em um projeto da faculdade... temos que fazer um compactador usando Huffman... até essa parte tudo bem... mas então quando vou descompactar dah esse StackOverflowError... procurei no google um tempo... e descobri que esse erro pode ser porque o programa chegou em um nivel de recursividade muito "fundo"... o que causaria esse erro... acredito que realmente possa ser isso... já que para descompactar ele deve descer uma arvore digital binaria varias vezes para encontrar os simbolos corretos... então basicamente a duvida é:

-Será que o erro esta msm sendo causado por essa recursividade???
-Alguem poderia dar alguma sugestão para "consertar" o codigo???

Parte do codigo (a função que usa recursão):
public void grava_chars(ArvoreDigital raiz, ArvoreDigital no, String bin, int pos, FileInputStream in, FileOutputStream out) throws IOException{


		if(no.codigo!=-1) {out.write(no.codigo); grava_chars(raiz, raiz, bin, pos, in, out);}

		else{
		if(pos>=bin.length()) {bin = fill_string(in); pos=0;}
		
		if(bin!=null){		

		char tmp = bin.charAt(pos);
		
			     if(tmp=='0') grava_chars(raiz, no.filho1, bin, pos+1, in, out);
			else if(tmp=='1') grava_chars(raiz, no.filho2, bin, pos+1, in, out);
		
		}
		}
}

5 Respostas

L

Olha soh, eh o que eu acho que esta acontecendo ok?..


primeiro as impressoes iniciais hehe queria saber 2 coisas:

  1. Como vc chama pela primeira vez o método, vc por acaso chama assim:
grava_chars(raiz, raiz, ....);

ou seja, passando a mesma variavel para raiz e noh??

  1. O que seria no.codigo != -1!? o que o codigo quer dizer?!

Eu acho que o erro esta ocorrendo aqui:

if (no.codigo != -1) {
    out.write(no.codigo);
    grava_chars(raiz, raiz, bin, pos, in, out);
}

Pode logo de cara estar entrando ai (com no.codigo != -1), e o método chama ele mesmo passando os mesmos parâmetros recebidos, e ai fica num looping eterno e stackoverflow.


Agora falando depois de olhar um pouco o codigo, por acaso quando no.codigo for diferente de -1, quer dizer que o nó não tem filho e faz ele voltar a raiz, isso?! tipo quando vc chegou a um noh folha e volta a raiz para continuar analisando de novo?!
Bem, se for isso, ai eu tem que ter o programa para testar para poder te dizer algo… mas chamar um método recursivo para cada binario que vc acha do arquivo, me parece ser perigoso, pois a recursão sera realmente grande.


Se vc postar seu codigo todo ai para que eu possa executar, eu poderia ver melhor. Soh um conselho, todo programa recursivo pode ser escrito de forma sequencial usando estruturas de repetição, embora mais elegante, não eh muito aconselhavel usar recursão por consumir mais memoria e ter pior performasse. Eu fiz assim meio que no olhometro (não testei nada, então pode estar errado ehhe) passar o seu programa para não ser recursivo, se quizer tentar ta ai:

public void grava_chars(ArvoreDigital raiz, FileInputStream in,
			FileOutputStream out) throws IOException {
		int pos = 0;
		String bin = fill_string(in);
		ArvoreDigital no = raiz;
		for (; bin != null;) {
			if ((no != null) && (no.codigo != -1)) {
				out.write(no.codigo);
				no = raiz;
			} else {
				char tmp = bin.charAt(pos++);
				no = (tmp == '0') ? no.filho1 : (tmp == '1') ? no.filho2 : null;
				
				if (pos >= bin.length()) {
					bin = fill_string(in);
					pos = 0;
				}
			}
		}
	}
I

vlw kra… vo testar o ki vc postou… e o no.codigo… eh o codigo do caracter que esta armazenado no nó… e como vc msm disse… se o codigo em 1 nó eh diferente de -1, então ele não tem filhos… :grin:

ps: se vc kiser eu posto o codigo todo aqui… mas ele ainda tah bem bagunçado… fika meio dificil de entender… :sad:

L

Blz então, da uma olhada nisso que te falei, e tenta descobrir certinho onde esta dando o stack, as vezes soh debugando mesmo para conseguir descobrir onde ocorre o erro.

I

kra num sei nem como te agradecer… funcionou perfeitamente… e ainda teve um aumento consideravel na velocidade… valeu msm… :grin: :grin:

T

Sou nova por aqui e adorei td por aqui e gostaria de dizer que também estou fazendo esse programa do compactador pelo método de huffman, então se vc quiser gostaria que vc me mandasse o seu código e eu te mando o meu para darmos uma olhada, ter algumas ideias ou tirarmos algumas dúvidas…

Sabe o meu trabalho não está total mente terminado faltam algumas coisas, então se eu puder contar com vc…

obrigada! :lol:

Criado 14 de novembro de 2006
Ultima resposta 17 de nov. de 2006
Respostas 5
Participantes 3