[RESOLVIDO]java.lang.StackOverflowError - hashCode

4 respostas
D

bem galera, estou com um erro estranho .. não sei se é meu relacionamento que esta errado ..
Erro:

Ago 23, 2012 4:08:58 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/boletos] threw exception [null] with root cause
java.lang.StackOverflowError
	at br.com.boletos.model.CondicaoPagamentoParcela.hashCode(CondicaoPagamentoParcela.java:82)
	at java.util.AbstractList.hashCode(AbstractList.java:541)
	at br.com.boletos.model.CondicaoPagamento.hashCode(CondicaoPagamento.java:162)
Código:
@Entity
@NamedQueries({
	@NamedQuery(name="condPgtParcela.porId",query="SELECT cdp FROM CondicaoPagamentoParcela cdp, CondicaoPagamento cp" +
			" WHERE cdp.condicaoPagamento = cp.id" +
			" AND cp.id =:id")
})
public class CondicaoPagamentoParcela implements Serializable {

	private static final long serialVersionUID = 5379993459346343431L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private int diasIntervalo;
	private String sequencia;
	
	@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
	@JoinColumn(name="condicaoPagamento")
	private CondicaoPagamento condicaoPagamento;

	public CondicaoPagamentoParcela() {}
	
	public CondicaoPagamentoParcela(int diasIntervalo, String sequencia) {
	
		this.diasIntervalo = diasIntervalo;
		this.sequencia = sequencia;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getDiasIntervalo() {
		return diasIntervalo;
	}

	public void setDiasIntervalo(int diasIntervalo) {
		this.diasIntervalo = diasIntervalo;
	}

	public String getSequencia() {
		return sequencia;
	}

	public void setSequencia(String sequencia) {
		this.sequencia = sequencia;
	}

	public CondicaoPagamento getCondicaoPagamento() {
		return condicaoPagamento;
	}

	public void setCondicaoPagamento(CondicaoPagamento condicaoPagamento) {
		this.condicaoPagamento = condicaoPagamento;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime
				* result
				+ ((condicaoPagamento == null) ? 0 : condicaoPagamento
						.hashCode());
		result = prime * result + diasIntervalo;
		result = prime * result + id;
		result = prime * result
				+ ((sequencia == null) ? 0 : sequencia.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof CondicaoPagamentoParcela))
			return false;
		CondicaoPagamentoParcela other = (CondicaoPagamentoParcela) obj;
		if (condicaoPagamento == null) {
			if (other.condicaoPagamento != null)
				return false;
		} else if (!condicaoPagamento.equals(other.condicaoPagamento))
			return false;
		if (diasIntervalo != other.diasIntervalo)
			return false;
		if (id != other.id)
			return false;
		if (sequencia == null) {
			if (other.sequencia != null)
				return false;
		} else if (!sequencia.equals(other.sequencia))
			return false;
		return true;
	}
}

4 Respostas

R

O que você estava tentando fazer quando foi lançado o erro ?

F

CondicaoPagamentoParcela tem um hashcode que depende de CondicaoPagamento.
Por sua vez, CondicaoPagamento tem um hashcode que depende da lista de CondicaoPagamentoParcela. Estou correto?
Ou seja, um chama o outro que chama o um.
O método será chamado ‘ao infinito e além!’

R

Hehehehe, ou igual aquele joguinho de empilhar os copos

ele vai empilhando até chegar uma hora que não aguenta mais.

D
Bem, eu precisava ver no Console em qual Loop ele estava, então fiz isso:
System.out.println("P: "+cp.getParcelas().get(i));
Então gerou o erro, ai testei assim:
System.out.println("P: "+i);
Porém, ainda dentro do próprio método acesso a variavel de novo daquela forma .. Não sei o pq de estar errado, mas resolvi, vou postar o método
for (int i=0; i < valorPar.size(); i++){
	System.out.println("P: "+i);
	System.out.println("V: "+valorPar.get(i));
	Financeiro parcela = new Financeiro(entrada.getNum_NF()+"/"+i,valorPar.get(i), 
			calculaVencimento(entrada.getData_Emissao(),cp.getParcelas().get(i).getDiasIntervalo()));
				
	parcelas.add(parcela);
}
Criado 23 de agosto de 2012
Ultima resposta 23 de ago. de 2012
Respostas 4
Participantes 3