Erro na execução de STACKOVERFLOW

Pessoal, onde identifico e como trato erro de “estouro de pilha” já que na compilação não me identifica o erro somente na execução, fiz um modelinho e não consigo identificar. :?:

segue o código:

public abstract class Cliente
{
//Atributos da Classe Cliente que sero herdados pelas outras classes
public double quantoGastou;
public String nome;
//Construtor da classe Cliente
public Cliente(String nome, double quantoGastou)
{
this.nome = nome;
this.quantoGastou = quantoGastou;
}
//Mtodo para “pegar” o custo
public double getquantoGastou()
{
return this.quantoGastou;
}
//Mtodo para “pegar” a quantidade de clientes
public double getConta()
{
return this.quantoGastou;
}
//Mtodo para “pegar” o nome
public String getNome()
{
return nome;
}
}

import java.util.*;

public class ClienteAssociado extends Cliente
{
private List avulsa;
//Construtor da classe ClienteAssociado
public ClienteAssociado(String nome, double quantoGastou)
{
super(nome, quantoGastou);// o mesmo que o this
this.avulsa = new LinkedList();
}
//Metodo que “joga” na lista os avulsos
public void setavulsa(List avulsa)
{
this.avulsa = avulsa;
}
//Adiciono na lista lista o nome e o valor do pessoal avulso
public void adicionaListaAvulsa(Cliente cl)
{
this.avulsa.add(cl);
}

public double getConta()
 {
        double valortotal = this.getConta();
        Iterator i = this.avulsa.iterator();
        Cliente cliente = null;
        	while(i.hasNext()) 
             {
                Cliente cl = (Cliente) i.next();
                valortotal += cliente.getConta();
             }
	return valortotal + this.getquantoGastou();		
 }

public String getNome() 
{
	String nomes = "";
	Iterator i = this.avulsa.iterator();
	while(i.hasNext()) 
	{
            	nomes += "\n" + (Cliente)i.next();
	}
	return (String) nomes;
}

}

public class ClienteAvulso extends Cliente
{
private double gastoAvulso;
private String nome;
//Construtor da classe ClienteAvulso
public ClienteAvulso(String nome, double gastoAvulso)
{
super(nome, gastoAvulso);// o mesmo que o this
this.gastoAvulso = gastoAvulso;
}
//Metodo para saber quanto o cliente avulso gastou
public double quantoGastou()
{
return this.gastoAvulso;
}
}

public class Principal
{
public static void main(String [] args)
{
//Cliente associado com seus parametros
ClienteAssociado associado = new ClienteAssociado(“Alessandra”, 1223.00);
//Clientes avulsos com seus parametros
ClienteAvulso avulso1 = new ClienteAvulso(“Carlos”,1560.00);
ClienteAvulso avulso2 = new ClienteAvulso(“Pedro”,400.00);
//Aqui associo o associado com o avulso
associado.adicionaListaAvulsa(avulso1);
associado.adicionaListaAvulsa(avulso2);
//Imprimo na tela o total do associado e seus dependentes
System.out.println( "Contribuio da Alessandra: " + associado.getConta());
System.out.println( "Dependente(s) Alessandra: " + associado.getNome());
}
}