Duvida StackOverFlowError

15 respostas
F

Galera estou fazendo o projeto do primeiro ano da facul. É um projeto de controle de estoque. Tenho as classes Produto, Interface, Estoque e Controle de Estoque...ta tudo compilando ate agora. Porem quando vou executar o Controle de estoque ele da esse erro aki:

Exception in thread "main" java.lang.StackOverflowError
	at Classes.Produto.<init>(Produto.java:18)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)
	at Classes.Produto.<init>(Produto.java:21)
	at Classes.Interface.<init>(Interface.java:9)

         ...........

O professor que é muito legal falo que é algum loop infinito que ta dando...pelo que o programa aponta aqui, quando vou instanciar o Produto e a Interface da essa execução infinita ate encher a memoria e parar...voces querem q eu poste os codigos das classes aqui? Tem bastante coisa até

15 Respostas

marvinla

Posta o código das classes Produto e Interface, fica mais fácil.
Porém suspeito que no construtor da classe Produto você instancia Interface e no construtor de Interface você instancia Produto.
Daí entra em loop até dar o stack overflow.

Para entender porque “stack overflow”: http://en.wikipedia.org/wiki/Call_stack.

Falou.

F
CONTROLE DE ESTOQUE


package Classes;
import javax.swing.JOptionPane;

public class ControleDeEstoque {
	
	public static void main(String[] args) {
		 int opcao = 0;
		Interface interface1 = new Interface();
		Estoque estoque = new Estoque();
		Produto produto = new Produto();
		do{
		opcao = interface1.menu();
		 switch(opcao)
		 {
		 case 1:String nome = interface1.nome();
		       String descricao = interface1.descricao();
				 double saldoQuantidadeMesAnterior = interface1.saldoQuantidadeMesAnterior();
				 double saldoDeCustoUnitarioDoMesAnterior = interface1.saldoDeCustoUnitarioDoMesAnterior();
		       produto.cadastrarProduto(nome, descricao,saldoQuantidadeMesAnterior,saldoDeCustoUnitarioDoMesAnterior);
			 break;
		 case 2: String codProduto = interface1.codigoProduto();
		     estoque.excluirProduto(codProduto);
		     break;
		 case 3:String codProduto1 = interface1.codigoProduto();
		 		int quant = interface1.quantidade();
		 		double custoUnitario = interface1.custoUnitario();
		 		produto.registrarProduto(codProduto1, quant, custoUnitario);
		 		break;
			case 4:
			break;
			
		 case 5: int dia = interface1.dia();
		        produto.consultarEntradaPorDia(dia);
		        break;
		case 6:
		break;
		 
		 case 7: int mes = interface1.mes();
		 produto.consultarEntradaPorMes(mes);
		 break;
		 case 8: 
		 break;
		 case 9:
		 break;
		 case 10: 
		 break;
		 case 11: 
		 break;
		 case 12: 
		 break;
		 case 13:
		 break;
		 case 14:
		 break;
		 case 0: produto.fim();
		 break;
		 default : interface1.opcaoInvalida();
		 }

		}while(opcao != 0);
	}

}
ESTOQUE

package Classes;

import java.util.ArrayList;

//Declaracao dos atributos
public class Estoque {
	private String mes;
	private int ano;
	private ArrayList<Produto> estoque;
Produto produto = new Produto();
Interface interface1 = new Interface();

	
	

	public Estoque()
	{
	
	
	}

	//Metodo construtor com parametros, nao padrao
	public Estoque(String mes, int ano, ArrayList<Produto> estoque) {
		this.mes = mes;
		this.ano = ano;
		this.estoque = estoque;
	}

	// Metodos de acesso
	public String getMes() {
		return mes;
	}

	public ArrayList<Produto> getEstoque() {
		return estoque;
	}

	public int getAno() {
		return ano;
	}

	// Metodos Modificadores
	public void setAno(int ano) {
		this.ano = ano;
	}

	public void setMes(String mes) {
		this.mes = mes;
	}

	public void setEstoque(ArrayList<Produto> estoque) {
		this.estoque = estoque;
	}
	//Metodo para excluir um produto cadastrado
	public void excluirProduto(String codProduto)
	{
		double x = Double.parseDouble(codProduto);
		for (int i = 0; i < produto.getFichaDeControle().length; i++) {
			if(produto.getFichaDeControle(i, 2)== x)
			{
				estoque.remove(x);
			}else 
			{
				interface1.excluir();
			}
			
			
		}
		
	}

}
INTERFACE

package Classes;
import javax.swing.JOptionPane;

public class Interface{

public Interface()
	{
	}
		Produto produto = new Produto();


	
	//Metodo para retornar que o mes nao é valido
	public void mensagemErro()
	{
		
		JOptionPane.showMessageDialog(null,"Digite um mes valido","Atençao",JOptionPane.WARNING_MESSAGE);
	}
	//Metodo para retornar que o codigo nao existe
	public void excluir() {
		JOptionPane.showMessageDialog(null,"Codigo nao encontrado, tente novamente!","Atençao",JOptionPane.WARNING_MESSAGE);
		
	}
	
	public int menu()
	{
	int x = 0;
			String menu =  JOptionPane.showInputDialog
				("\nDigite o numero da opcao desejada:\n1)Incluir Produto\n"
				+"\n2)Excluir Produto\n"
				+"\n3)Registrar quantidade de entrada de produtos\n"
				+"\n4)Registrar quantidade de saida de de produtos\n"
				+"\n5)Consultar quantidade de entrada de produtos por dia\n"
				+"\n6)Consultar quantidade de saida de produtos por dia\n"
				+"\n7)Consultar total de entrada de produtos por mes\n"
				+"\n8)Consultar total de saida de produtos por mes\n"
				+"\n9)Saldo do produto por mes\n"
				+"\n10)Relatorio Mensal\n"
				+"\n11)Relatorio parcial\n"
				+"\n12)Consultar produtos em estoque por dia\n"
				+"\n13)Produto mais vendido por mes\n"
				+"\n14Produto menos vendido por mes\n"
				+"\n0)Sair");
				
				x	= Integer.parseInt(menu);
				return x;
			
   
    
	}
	//instanciando um objeto da classe produto
	//Metodo para entrar com o ano e mes
	public void mensagemPrincipal()
	{
		String ano = JOptionPane.showInputDialog("Entre com o ano: ");
		int a = Integer.parseInt(ano);
		String mes = JOptionPane.showInputDialog("Entre com o mes desejado: ");
		int b = Integer.parseInt(mes);
	}
	//Metodo para entrar com o dia
	public int consultar()
	{
		String dia = JOptionPane.showInputDialog("Entre com o dia desejado: ");
		int a = Integer.parseInt(dia);
		return a;
	}

	public void retornarConsultaEntrada()
	{ int a = consultar();
		JOptionPane.showMessageDialog(null, 
				"O dia desejado é: "+a+"Os dados das mercarias neste dia sao:"+produto.consultarEntradaPorDia(a));
	}
	//Metodo para mensagem de erro 
	public void mensagemErro2() 
	{
		JOptionPane.showMessageDialog(null,"Nao foram encontrados registros neste dia");
	}
	//Metodo pra entrar com o nome do produto
	public String nome()
	{
		String nome = JOptionPane.showInputDialog("Digite o nome do produto: ");
		return nome;
	}
	//Metodo pra entrar com a descriçao do produto
	public String descricao()
	{
		String descricao = JOptionPane.showInputDialog("Faça uma breve descricao sobre o produto: ");
		return descricao;
		
	}
	//Metodo para mensagem de erro de opçao invalida 
	public void opcaoInvalida()
	{
		JOptionPane.showMessageDialog(null,"Opção invalida!");
	}
	//metodo pra entrar com o codigo do produto
	public String codigoProduto()
	{
		String codProduto = JOptionPane.showInputDialog("Digite o codigo do produto: ");
		return codProduto;
		
	}
	//metodo para com quantidade do produto que entrou
	public int quantidade()
	{
		String quant = JOptionPane.showInputDialog("Digite a quantidade da mercadoria: ");
		return Integer.parseInt(quant);
	}
	//Metodo para entrar com o custo unitario do produto que entrou
	public double custoUnitario()
	{
		String custoUnitario = JOptionPane.showInputDialog("Digite o custo unitario de cada mercadoria: ");
		return Double.parseDouble(custoUnitario);
	}
	//metodo para entrar com o dia desejado
	public int dia()
	{
		String dia = JOptionPane.showInputDialog("Digite o dia do mes desejado: ");
		return Integer.parseInt(dia);
	}
	//metodo para entrar com o mes desejado
	public int mes()
	{
		String mes = JOptionPane.showInputDialog("Digite o  mes desejado: ");
		return Integer.parseInt(mes);	
	}
	//metodo para mensagem de erro de codigo nao encontrado
	public void mensagemErro3() {
		JOptionPane.showMessageDialog(null,"Nao foram encontrados produtos com este codigo");
		
		
	}
	public double saldoQuantidadeMesAnterior()
	{
	String saldo = JOptionPane.showInputDialog("Digite o saldo da quantidade do produto do mes anterior: ");
		return Double.parseDouble(saldo);	

	}
	
	public double saldoDeCustoUnitarioDoMesAnterior()
	{
	String saldo = JOptionPane.showInputDialog("Digite o saldo do custo unitario do produto do mes anterior: ");
		return Double.parseDouble(saldo);	

	}

}
PRODUTO

package Classes;

public class Produto {
	
	//declaracao dos atributos
	private String nome;
	private String descricao;
	private double custoUnitario;
	private String codigoDoProduto;
	private double fichaDeControle[][];
	private double saldoDeQuantidadeDoMesAnterior;
	private double saldoDeCustoUnitarioDoMesAnterior;

	
	
	//Metodo construtor Padrao
	public Produto()
	{
		
	}
		Interface interface2 = new Interface();
	

	//Metodo construtor parametrizado
	public Produto(String nome, String descricao, 
			double custoUnitario, String codigoDoProduto,
			double[][] fichaDeControle, double saldoDeQuantidadeDoMesAnterior,
			double saldoDeCustoUnitarioDoMesAnterior) {
	
		this.nome = nome;
		this.descricao = descricao;
		this.custoUnitario = custoUnitario;
		this.codigoDoProduto = codigoDoProduto;
		this.fichaDeControle = fichaDeControle;
		this.saldoDeQuantidadeDoMesAnterior = saldoDeQuantidadeDoMesAnterior;
		this.saldoDeCustoUnitarioDoMesAnterior = saldoDeCustoUnitarioDoMesAnterior;
	}



	//Metodos de Acesso
	public double getCustoUnitario() 
	{
		return custoUnitario;
	}
	public double[][] getFichaDeControle() {
		return fichaDeControle;
	}
	public double getFichaDeControle(int l, int c)
	{
		return fichaDeControle[l][c];
	}
	
	public double getSaldoDeCustoUnitarioDoMesAnterior() {
		return saldoDeCustoUnitarioDoMesAnterior;
	}
	public double getSaldoDeQuantidadeDoMesAnterior() {
		return saldoDeQuantidadeDoMesAnterior;
	}

	public String getNome() {
		return nome;
	}
	
	//Metodos Modificadores
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public String getCodigoDoProduto() {
		return codigoDoProduto;
	}

	public void setCustoUnitario(double custoUnitario) {
		this.custoUnitario = custoUnitario;
	}
	
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	
	public void setCodigoDoProduto(String codigoDoProduto) {
		this.codigoDoProduto = codigoDoProduto;
	}
	
	public void setFichaDeControle(double[][] fichaDeControle) {
		this.fichaDeControle = fichaDeControle;
	}
	
	public void setSaldoDeQuantidadeDoMesAnterior(
			double saldoDeQuantidadeDoMesAnterior) {
		this.saldoDeQuantidadeDoMesAnterior = saldoDeQuantidadeDoMesAnterior;
	}
	
	public void setSaldoDeCustoUnitarioDoMesAnterior(
			double saldoDeCustoUnitarioDoMesAnterior) {
		this.saldoDeCustoUnitarioDoMesAnterior = saldoDeCustoUnitarioDoMesAnterior;
	}
//Metodo para incluir uma mercadoria	a
	public void cadastrarProduto(String nome,String descricao,double saldoDeQuantidadeDoMesAnterior,
	double saldoDeCustoUnitarioDoMesAnterior)
	{	
	String n = nome;
	String d = descricao;
	double s = saldoDeQuantidadeDoMesAnterior;
	double scu = saldoDeCustoUnitarioDoMesAnterior;
	String c = codigoDoProduto();
	
		
			}
	
	//Metodo para gerar o codigo a partir das tres primeiras letrar do nome e 2 numeros aleatorios	
	//Atribui esse metodo como "Private" pois o mesmo é necessario para criar outro metodo e nao a classe como um todo.
	private String codigoDoProduto()
	{
	   
		 codigoDoProduto = (getNome().substring(0, 3)); 
		 int numaleatorio = 0; 
		 numaleatorio = (int)(Math.random()*100);
		 return codigoDoProduto + numaleatorio;
		 

	}
	//Metodo pra registrar a entrada de mercadorias b
	public void registrarProduto(String codProduto,int quant,double custoUnitario)
	{
		for (int linha = 0; linha < fichaDeControle.length; linha++) 
		{  
			if(getFichaDeControle(linha,2) == Double.parseDouble(codProduto ))
			{
				double custoTotal = (custoUnitario * quant);
				fichaDeControle[linha][0] = quant;
				fichaDeControle[linha][1] = custoUnitario;
				fichaDeControle[linha][2] = custoTotal;
				
				
			}else
			{
				interface2.mensagemErro();
			}
		}
		
			
		}
		//Metodo para registrar a quantidade de saida(venda) de produtos c 
		public void registrarSaidaProduto(String codProduto,int quant,double custoUnitario)
		{
			for (int linha = 0; linha < fichaDeControle.length; linha++) 
			{  
				if(getFichaDeControle(linha,2) == Double.parseDouble(codProduto ))
				{
					double custoTotal = (custoUnitario * quant);
					fichaDeControle[linha][3] = quant;
					fichaDeControle[linha][4] = custoUnitario;
					fichaDeControle[linha][5] = custoTotal;
					
					
				}else
				{
					interface2.mensagemErro3();
				}
				
			}
		
	}
	
	//Metodo para consultar a entrada de mercadorias por dia 
    public int[] consultarEntradaPorDia(int dia){
       //usuario diagitar o dia 
    	int cont[] = new int [9];
       for(int i=0;i<3;i++)//Coloquei este valores com i inicializando em 0 e indo ate 3 pois quero retornar apenas as colunas 3,4,5
       {
    	   if(fichaDeControle != null)
    	   {
    		   for (int j = 0; j < cont.length; j++) 
    		   {
    			   cont[j] +=getFichaDeControle(dia,i);
    		   }
				
			}
    	   else 
    	   {
    		   interface2.mensagemErro2();
    	   }
	      
    		  
    	   }
       
    	  
         
       
       return cont;
    }
    //Encerra o menu
    public void fim()
	{
		System.exit(0);
	}
    //Metodo para consultar a entrada de produtos em um mes
    public double[][] consultarEntradaPorMes(int mes)
    {
        //usuario digita o mes
    	double cont[][] = new double[30][5];
     	for(int dia=0;dia<fichaDeControle.length;dia++)
        {
     	 for (int coluna = 0; coluna < cont.length; coluna++) 
     		   {
     		     if(mes <=12)
     		     {
     			   cont[dia][coluna] = getFichaDeControle(dia,coluna);
     		     } else 
     	     	   {
     	     		   interface2.mensagemErro2();
     	     	   }
     		   }
 				
 			}
     	 
 	      return cont;
     		  
     	   }

}
F

marvinla:
Posta o código das classes Produto e Interface, fica mais fácil.
Porém suspeito que no construtor da classe Produto você instancia Interface e no construtor de Interface você instancia Produto.
Daí entra em loop até dar o stack overflow.

Para entender porque “stack overflow”: http://en.wikipedia.org/wiki/Call_stack.

Falou.

O problema é que eu to auxiliando a menina que é minha dupla, e ela que vai fazendo o codigo…ela ta mais rapida de script que eu, mas realmente oq vc disse acontece, esta instanciando interface no produto e produto na interface…eu troquei so que ai começo da erro, testa pra ver

F

UP. Algume?

Rodrigo_Sasaki

No corpo da classe Produto você instancia Interface, e no corpo da classe Interface você instancia Produto,
e aí no corpo da classe Produto você instancia Interface e no corpo da classe Interface você instancia Produto,
logo depois no corpo da classe Produto você instancia Interface e aí no corpo da classe Interface você instancia Produto.

Entende onde quero chegar?

F

digaoneves:
No corpo da classe Produto você instancia Interface, e no corpo da classe Interface você instancia Produto,
e aí no corpo da classe Produto você instancia Interface e no corpo da classe Interface você instancia Produto,
logo depois no corpo da classe Produto você instancia Interface e aí no corpo da classe Interface você instancia Produto.

Entende onde quero chegar?

Não saquei…voce ta dizendo q no codigo eu estou instanciado interface na classe produto e instanciando produto na classe interface? Voce ta repetindo muito x.X

Rodrigo_Sasaki

É exatamente esse o ponto, você está entrando em um buraco sem fim aí.

Quando você instancia um Produto, ele instancia um objeto do tipo Interface, ok? É só ver no seu código, na linha 23 da classe Produto que você postouInterface interface2 = new Interface(); E na classe Interface, você instancia um objeto do tipo Produto, linha 11Produto produto = new Produto(); Se você pensar no que isso causa, ou fizer um teste de mesa, tanto com papel ou com um depurador, vai ver que a execução nunca é terminada, pois um sempre chama o outro. Entendeu?

BrunoPeresREAL

fenloki:
digaoneves:
No corpo da classe Produto você instancia Interface, e no corpo da classe Interface você instancia Produto,
e aí no corpo da classe Produto você instancia Interface e no corpo da classe Interface você instancia Produto,
logo depois no corpo da classe Produto você instancia Interface e aí no corpo da classe Interface você instancia Produto.

Entende onde quero chegar?

Não saquei…voce ta dizendo q no codigo eu estou instanciado interface na classe produto e instanciando produto na classe interface? Voce ta repetindo muito x.X

Na verdade, repetir muito é o problema do seu código. Note que ao instanciar interface você instancia um produto, que instancia uma interface, que instancia um produto… Repete várias vezes até gerar um StackOverFlow! :slight_smile:

Att,

F

digaoneves:
É exatamente esse o ponto, você está entrando em um buraco sem fim aí.

Quando você instancia um Produto, ele instancia um objeto do tipo Interface, ok? É só ver no seu código, na linha 23 da classe Produto que você postouInterface interface2 = new Interface(); E na classe Interface, você instancia um objeto do tipo Produto, linha 11Produto produto = new Produto(); Se você pensar no que isso causa, ou fizer um teste de mesa, tanto com papel ou com um depurador, vai ver que a execução nunca é terminada, pois um sempre chama o outro. Entendeu?

Aaa saquei…bom na verdade esse erro não foi meu e sim da minha colega de turma…so peguei o codigo ontem pra analisar esse erro. Obrigado vou conversar com ela pra tentar arrumar! vlw galera eu posto aqui quando conseguir

F

O que eu preciso fazer para arruma é intanciar o produto no produto e a interface na interface é isso? Ou eu instancioi tudo junto numa classe?

Rodrigo_Sasaki

Aí vai depender do seu sistema, mas provavelmente isso que você disse não é a solução.

É provável que seja necessário que existam essas instâncias, mas não é uma boa ideia instanciá-las dessa maneira.

Procure dar o new quando ele for necessário. Provavelmente não é aí.

F

digaoneves:
Aí vai depender do seu sistema, mas provavelmente isso que você disse não é a solução.

É provável que seja necessário que existam essas instâncias, mas não é uma boa ideia instanciá-las dessa maneira.

Procure dar o new quando ele for necessário. Provavelmente não é aí.

Mas no caso se não é “aqui” é aonde então? Voce consegue fazer algum teste ai e ver? Eu to num pc que nao da pra testar…so a noite vou conseguir

Rodrigo_Sasaki

Infelizmente não tenho tempo pra fazer isso agora, mas fale com sua parceira, para instanciar o Produto no lugar onde ele é necessário e não antes, ou talvez seja melhor um ter a referência do outro, passando ela pelo construtor, não sei como está o seu sistema, converse com ela.

F

Infelizmente não tenho tempo pra fazer isso agora, mas fale com sua parceira, para instanciar o Produto no lugar onde ele é necessário e não antes, ou talvez seja melhor um ter a referência do outro, passando ela pelo construtor, não sei como está o seu sistema, converse com ela.

puuutz cara era isso mesmo que pensei e falei com ela!!! Para passar pelo construtor! Vou falar com ela de novo, obrigado por tudo!

Rodrigo_Sasaki

Sem problemas, depois poste aqui qual foi a solução. :slight_smile:

Criado 8 de outubro de 2012
Ultima resposta 9 de out. de 2012
Respostas 15
Participantes 4