Erro de StackOverFlow galeraaa!

10 respostas
andre_bento

Fala ae pessoal!!!
Po galera... to precisando muito da ajuda de vcs ae!!!
A parada é o seguinte...Estou desenvolvendo um aplicativo para um amigo meu aqui e empaquei em uma parte aqui do projeto!
Tipo... estou precisando de buscar algumas informações no banco através de meu controle... só que toda vez que crio um objeto da minha tela para poider pegar as informações do textField ele me vem com um erro de StackOverFlow! Mas não sei como consegui estourar a pilha!!
O código do meu controle é esse ae:

package controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import modelo.Login;
import visao.TelaLogin;
import dao.DAOFactory;
import dao.DAOLogin;

public class ControleLogin implements ActionListener{

	
	 DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	 DAOLogin dao = df.getDAOLogin();
	
	 private TelaLogin  tela ;

	public TelaLogin (){

                   tela = new TelaLogin(); //toda vez que tento isso ele me vem com o StackOverFlow!!!!!
                   }
	
	 public void actionPerformed(ActionEvent evt) {
		
		String comando = evt.getActionCommand();
		
		if (comando.equals("entrar")){
			try{
			Login l = new Login();
			l.setUsuario(tela.getTxtUsuario());
			dao.consultar(l);
			if (l.getUsuario()!= null){
				JOptionPane.showMessageDialog (null, "Suuuuuucesso!");
			}
			JOptionPane.showMessageDialog(null, "ERRO");
		}
	
	catch (Exception e){
	
		JOptionPane.showMessageDialog (null, "ERRO :" +e);
		
			}
		}
	}
	
	

	
	
	
}

O código da minha tela é esse ae :

package visao;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRootPane;
import javax.swing.JTextField;

import modelo.Login;
import controle.ControleLogin;

public class TelaLogin {
	private JFrame pFrame;
	private JDialog fDialog;
	private JLabel lblUsuario;
	private JLabel lblSenha;
	private JTextField txtUsuario;
	private JPasswordField pswSenha;
	private Container c;
	private JPanel pNorte;
	private JPanel pCentro;
	private JPanel pCampos;
	private JPanel pBotoes;
	private JPanel pImagem;
	
	 
	public TelaLogin(){
		
		//controle
		ControleLogin controle = new ControleLogin();
		
		
		//constroi o dialog
		fDialog = new JDialog(pFrame, true);
				
		//cria componentes
		c = fDialog.getContentPane();
		c.setLayout(new BorderLayout());
		pNorte = new JPanel(new FlowLayout(FlowLayout.CENTER));
		pBotoes = new JPanel(new GridLayout(1,2,20,5));
		pCentro = new JPanel( new FlowLayout(FlowLayout.CENTER));
		
		GridBagConstraints gc = new GridBagConstraints();
		//distancia em comprimento dos componetes
		gc.ipadx = 10;
		//alinhamento de componentes
		gc.anchor = GridBagConstraints.FIRST_LINE_START;
		//distancia das bordas dos componetes
		gc.insets = new Insets(5,5,2,2);
		
		
		pCampos = new JPanel(new GridBagLayout());
		pImagem = new JPanel(new GridBagLayout());
		
		lblUsuario = new JLabel("Usuário");
		txtUsuario = new JTextField(20);
		txtUsuario.setToolTipText("Digite seu nome de usuário no sistema");
		lblSenha = new JLabel("Senha");
		pswSenha = new JPasswordField(20);
		pswSenha.setToolTipText("Digite sua senha no sistema");
		JButton btnEntrar = new JButton("Entrar");
		btnEntrar.setIcon(new ImageIcon("icIr.png"));
		btnEntrar.setToolTipText("Clique aqui para realizar o Login no sistema!");
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.setIcon(new ImageIcon("icCancelar.png"));
		
		//relaciona nome do componente ao evento.
		btnEntrar.setActionCommand("entrar");
		btnCancelar.setActionCommand("cancelar");
		
		//cria a imagem e o texto de bem-vindo
		JLabel lb = new JLabel();
		lb.setIcon(new ImageIcon("login.png"));
		JLabel texto = new JLabel("<html><center>Seja bem-vindo ao sistema.<br>Por favor, insira seu login e<br>senha. Se você não possui<br>login e senha, por favor,<br>contate o administrador.<br><br><br></center></html>");
		texto.setFont(new Font("Arial",1,16));
		lb.setOpaque(false);
		
		//adicionando componentes no gridBagLayout
		gc.gridx = 0;
		gc.gridy = 1;
		pCampos.add(lblUsuario,gc);
		gc.gridx = 1;
		gc.gridy = 1;
		pCampos.add(txtUsuario,gc);
		gc.gridx = 0;
		gc.gridy = 2;
		pCampos.add(lblSenha,gc);
		gc.gridx = 1;
		gc.gridy = 2;
		pCampos.add(pswSenha,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=2;
		gc.fill = GridBagConstraints.HORIZONTAL;
		pCampos.add(texto,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=0;
		gc.fill=0;
		pImagem.add(lb,gc);
		
		//adiciona componentes ao gridlayout
		pBotoes.add(btnEntrar);
		pBotoes.add(btnCancelar);
		
		//adiciona componentes ao container.
		pNorte.add(pImagem);
		pNorte.add(pCampos);
		pCentro.add(pBotoes);
		c.add(pNorte,BorderLayout.NORTH);
		c.add(pCentro,BorderLayout.CENTER);
		
		//adiciona ouvintes nos componentes
		btnEntrar.addActionListener(controle);
		btnCancelar.addActionListener(controle);
		
		//faz o botão entrar ser o padrão
		btnEntrar.setDefaultCapable(true);
		JRootPane rp = fDialog.getRootPane();
		rp.setDefaultButton(btnEntrar);
		
		
		//mostra a Dialog
		fDialog.setTitle("Login SCC");
		fDialog.pack();
		fDialog.setLocationRelativeTo(null);
		fDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		fDialog.setVisible(true);
		
	}//fim do construtor


	public Login pegaDados (Login l){
		String usuario = txtUsuario.getText();
		
		l.setUsuario(usuario);
		return l;
		
		
	}


	public String getTxtUsuario() {
		String txtUsuario2 = txtUsuario.getText();
		return txtUsuario2;
	}


	public void setTxtUsuario(JTextField txtUsuario) {
		this.txtUsuario = txtUsuario;
	}
	
	 
}//fim da classe

Po galera... me dá essa força ae!!! :D
Desde já agradeço muito pela ajuda ae!!
Abração a todos!!!

10 Respostas

rafaelglauber

Oi,

RECURSIVIDADE, cuidado com ela!!!

Você tá chamando o construtor padrão dentro dele mesmo, isso tá levando ao estouro da pilha.

Ironlynx

André, em geral isso ocorre quando vc tem uma chamada recursiva em algum lugar, algum looping doido.E esse construtor aí com tudo anexado pode ser a resposta.

public TelaLogin (){   
  
                   tela = new TelaLogin(); //toda vez que tento isso ele me vem com o StackOverFlow!!!!!   
                   }
andre_bento

Olá amigo!!!
Primeiramente valeu mesmo pela atenção aee!!!
Po cara… se poderia mostar ae no código em que parte to fazendo errado??
Num to conseguindo ver aonde!!
Brigadão amigão!!

andre_bento

Amigos retirei a parte do código que o amigo mencionou acime do meu construtor…
SEm criar um novo objeto da tela ele não dá o erro… mas toda vez que crio o objeto seja em qualquer lugar ele acusa o erro!!
Valeu pela atenção amigos!!

andre_bento

Amigos retirei a parte do código que o amigo mencionou acime do meu construtor…
SEm criar um novo objeto da tela ele não dá o erro… mas toda vez que crio o objeto seja em qualquer lugar ele acusa o erro!!
Valeu pela atenção amigos!!

J

Acredito que você tenha postado o codigo errado, e que o correto seja:

public ControleLogin() { tela = new TelaLogin(); }

Nesse caso, você está errando porque você está criando uma instância de TelaLogin dentro do construtor de ControleLogin, e está criando uma instância de ControleLogin dentro do construtor de TelaLogin, isso vai gerar um loop infinito, veja:

public ControleLogin() { tela = new TelaLogin(); }

public TelaLogin(){ ControleLogin controle = new ControleLogin(); }

Quando o construtor de ControleLogin for chamado, ele vai chamar o construtor de TelaLogin, que por sua vez chamará o construtor de ControleLogin, que por sua vez chama o construtor de TelaLogin, que por sua vez… bom acho que já deu pra entender né! :roll:

Veja a pilha:

new ControleLogin() new TelaLogin() new ControleLogin() new TelaLogin() new ControleLogin() new TelaLogin() ...

J

Aproveitando, talvez o que você queira seja isso:

public TelaLogin(ControleLogin controle){

   fDialog = new JDialog(pFrame, true);
   //...
}
public ControleLogin() {  
   tela = new TelaLogin(this);
}
PadrE

Só para ajudar...

jairelton:
Aproveitando, talvez o que você queira seja isso:
public TelaLogin(ControleLogin controle){

   fDialog = new JDialog(pFrame, true);
   //...
}

Linhas 39 a 42 do segundo arquivo

jairelton:
public ControleLogin() {  
   tela = new TelaLogin(this);
}

Linha 21 a 23 no primeiro arquivo,..

andre_bento

Olá galera!!!
Po jairelton valeu mesmo ae!!!
Consegui resolver o problema do OverFlow!!!!
Mas agora me surgiu outro problema.. .se possível me ajuda ae galera!!
Tipo...Tenho que pegar as informações que o cara digitou em um textField e depois setar minha classe modelo para poder realizar a consulta no banco...Mas toda vez que tento fazer a consulta o meu objeto volta nulo e me dá o erro de nullPointerException!!!

Segue meu código da tela... corrigido sem o overFlow!!
package visao;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRootPane;
import javax.swing.JTextField;

import controle.ControleLogin;

public class TelaLogin {
	private JFrame pFrame;
	private JDialog fDialog;
	private JLabel lblUsuario;
	private JLabel lblSenha;
	private JTextField txtUsuario;
	private JPasswordField pswSenha;
	private Container c;
	private JPanel pNorte;
	private JPanel pCentro;
	private JPanel pCampos;
	private JPanel pBotoes;
	private JPanel pImagem;
	
	
	 private String usuario;
	 
	public TelaLogin(ControleLogin controle){
		
		
		//constroi o dialog
		fDialog = new JDialog(pFrame, true);
				
		//cria componentes
		c = fDialog.getContentPane();
		c.setLayout(new BorderLayout());
		pNorte = new JPanel(new FlowLayout(FlowLayout.CENTER));
		pBotoes = new JPanel(new GridLayout(1,2,20,5));
		pCentro = new JPanel( new FlowLayout(FlowLayout.CENTER));
		
		GridBagConstraints gc = new GridBagConstraints();
		//distancia em comprimento dos componetes
		gc.ipadx = 10;
		//alinhamento de componentes
		gc.anchor = GridBagConstraints.FIRST_LINE_START;
		//distancia das bordas dos componetes
		gc.insets = new Insets(5,5,2,2);
		
		
		pCampos = new JPanel(new GridBagLayout());
		pImagem = new JPanel(new GridBagLayout());
		
		lblUsuario = new JLabel("Usuário");
		txtUsuario = new JTextField(20);
		txtUsuario.setToolTipText("Digite seu nome de usuário no sistema");
		usuario = txtUsuario.getText();
		
		lblSenha = new JLabel("Senha");
		pswSenha = new JPasswordField(20);
		pswSenha.setToolTipText("Digite sua senha no sistema");
		JButton btnEntrar = new JButton("Entrar");
		btnEntrar.setIcon(new ImageIcon("icIr.png"));
		btnEntrar.setToolTipText("Clique aqui para realizar o Login no sistema!");
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.setIcon(new ImageIcon("icCancelar.png"));
		
		//relaciona nome do componente ao evento.
		btnEntrar.setActionCommand("entrar");
		btnCancelar.setActionCommand("cancelar");
		
		//cria a imagem e o texto de bem-vindo
		JLabel lb = new JLabel();
		lb.setIcon(new ImageIcon("login.png"));
		JLabel texto = new JLabel("<html><center>Seja bem-vindo ao sistema.<br>Por favor, insira seu login e<br>senha. Se você não possui<br>login e senha, por favor,<br>contate o administrador.<br><br><br></center></html>");
		texto.setFont(new Font("Arial",1,16));
		lb.setOpaque(false);
		
		//adicionando componentes no gridBagLayout
		gc.gridx = 0;
		gc.gridy = 1;
		pCampos.add(lblUsuario,gc);
		gc.gridx = 1;
		gc.gridy = 1;
		pCampos.add(txtUsuario,gc);
		gc.gridx = 0;
		gc.gridy = 2;
		pCampos.add(lblSenha,gc);
		gc.gridx = 1;
		gc.gridy = 2;
		pCampos.add(pswSenha,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=2;
		gc.fill = GridBagConstraints.HORIZONTAL;
		pCampos.add(texto,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=0;
		gc.fill=0;
		pImagem.add(lb,gc);
		
		//adiciona componentes ao gridlayout
		pBotoes.add(btnEntrar);
		pBotoes.add(btnCancelar);
		
		//adiciona componentes ao container.
		pNorte.add(pImagem);
		pNorte.add(pCampos);
		pCentro.add(pBotoes);
		c.add(pNorte,BorderLayout.NORTH);
		c.add(pCentro,BorderLayout.CENTER);
		
		//adiciona ouvintes nos componentes
		btnEntrar.addActionListener(controle);
		btnCancelar.addActionListener(controle);
		
		//faz o botão entrar ser o padrão
		btnEntrar.setDefaultCapable(true);
		JRootPane rp = fDialog.getRootPane();
		rp.setDefaultButton(btnEntrar);
		
		
		//mostra a Dialog
		fDialog.setTitle("Login SCC");
		fDialog.pack();
		fDialog.setLocationRelativeTo(null);
		fDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		fDialog.setVisible(true);
		
		
	}//fim do construtor




	public String pegaDados (){
		usuario = txtUsuario.getText();
		//fiz o seguitne código mas ele não está pegando as informações do txtUsuario... não sei por que!!?!?!??!
		return usuario;
		
		
	}


	


	public void mostra() {
		JOptionPane.showMessageDialog(null,"NOME :"+usuario);
	}
	
	 
}//fim da classe
O código do meu controle... também sem o erro de overFlow galera!
package controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import modelo.Login;
import visao.TelaLogin;
import dao.DAOFactory;
import dao.DAOLogin;

public class ControleLogin implements ActionListener{

	
	 DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	 DAOLogin dao = df.getDAOLogin();
	
	 private TelaLogin  tela;
	 
	
	public ControleLogin(){
		
		tela = new TelaLogin(this);
	}
	
	 public void actionPerformed(ActionEvent evt) {
		
		String comando = evt.getActionCommand();
		
		if (comando.equals("entrar")){
			try{
			Login l = new Login();
			l.setUsuario(tela.pegaDados());
			dao.consultar(l);
			if (l.getUsuario()!= null){
				JOptionPane.showMessageDialog (null, "Suuuuuucesso!");
			}
			JOptionPane.showMessageDialog(null, "ERRO");
		}
	
	catch (Exception e){
	
		JOptionPane.showMessageDialog (null, "ERRO :" +e);
		
			}
		}
	}
	
	

	
	
	
}

Me ajuda aeeee!!!
Um abraço a todos!!!

andre_bento

Fala galera...
Bom consegui consertar o erro de overFlow galera... por isso mudei o nome do tópico ae pra ver se ajuda mais alguém ae do fórum... Vou postar o código correto pra que se algum amigo precisar possa analisar!!!
Preciso de mais alguma ajuda mas o assunto não é relaciona a esse tema!!
Agradeço a todos!!

package controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import modelo.Login;
import visao.TelaLogin;
import dao.DAOFactory;
import dao.DAOLogin;

public class ControleLogin implements ActionListener{

	
	 DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	 DAOLogin dao = df.getDAOLogin();
	 private ControleLogin controle;
	 private TelaLogin  tela ;
	
	 
	
	public ControleLogin(){
		
		tela = new TelaLogin(this);
	}
	
	 public void actionPerformed(ActionEvent evt) {
		
		String comando = evt.getActionCommand();
		
		if (comando.equals("entrar")){
			try{
			JOptionPane.showMessageDialog (null, "Nome :"+tela.pegaDados());
			Login l = new Login();
			l.setUsuario(tela.pegaDados());
			dao.consultar(l);
			if (l.getUsuario()!= null){
				JOptionPane.showMessageDialog (null, "Suuuuuucesso!");
			}
			JOptionPane.showMessageDialog(null, "ERRO");
		}
	
	catch (Exception e){
	
		JOptionPane.showMessageDialog (null, "ERRO :" +e);
		
			}
		}
		
		if (comando.equals("cancelar")){
			try{
			tela.fechar();
		}
			
			catch (Exception e){
				JOptionPane.showMessageDialog(null,"ERRO :"+e);}
			}
	}
	
	

	
	
	
}
package visao;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRootPane;
import javax.swing.JTextField;

import controle.ControleLogin;

public class TelaLogin extends JFrame{
	private JFrame pFrame;
	private JDialog fDialog;
	private JLabel lblUsuario;
	private JLabel lblSenha;
	private JTextField txtUsuario;
	private JPasswordField pswSenha;
	private Container c;
	private JPanel pNorte;
	private JPanel pCentro;
	private JPanel pCampos;
	private JPanel pBotoes;
	private JPanel pImagem;
	private TelaLogin tela;
	
	 private String usuario;
	 
	public TelaLogin(ControleLogin controle){
		
		
		//constroi o dialog
		fDialog = new JDialog(pFrame, true);
				
		//cria componentes
		c = fDialog.getContentPane();
		c.setLayout(new BorderLayout());
		pNorte = new JPanel(new FlowLayout(FlowLayout.CENTER));
		pBotoes = new JPanel(new GridLayout(1,2,20,5));
		pCentro = new JPanel( new FlowLayout(FlowLayout.CENTER));
		
		GridBagConstraints gc = new GridBagConstraints();
		//distancia em comprimento dos componetes
		gc.ipadx = 10;
		//alinhamento de componentes
		gc.anchor = GridBagConstraints.FIRST_LINE_START;
		//distancia das bordas dos componetes
		gc.insets = new Insets(5,5,2,2);
		
		
		pCampos = new JPanel(new GridBagLayout());
		pImagem = new JPanel(new GridBagLayout());
		
		lblUsuario = new JLabel("Usuário");
		txtUsuario = new JTextField(20);
		txtUsuario.setToolTipText("Digite seu nome de usuário no sistema");
		usuario = txtUsuario.getText();
		
		lblSenha = new JLabel("Senha");
		pswSenha = new JPasswordField(20);
		pswSenha.setToolTipText("Digite sua senha no sistema");
		JButton btnEntrar = new JButton("Entrar");
		btnEntrar.setIcon(new ImageIcon("icIr.png"));
		btnEntrar.setToolTipText("Clique aqui para realizar o Login no sistema!");
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.setIcon(new ImageIcon("icCancelar.png"));
		
		//relaciona nome do componente ao evento.
		btnEntrar.setActionCommand("entrar");
		btnCancelar.setActionCommand("cancelar");
		
		//cria a imagem e o texto de bem-vindo
		JLabel lb = new JLabel();
		lb.setIcon(new ImageIcon("login.png"));
		JLabel texto = new JLabel("<html><center>Seja bem-vindo ao sistema.<br>Por favor, insira seu login e<br>senha. Se você não possui<br>login e senha, por favor,<br>contate o administrador.<br><br><br></center></html>");
		texto.setFont(new Font("Arial",1,16));
		lb.setOpaque(false);
		
		//adicionando componentes no gridBagLayout
		gc.gridx = 0;
		gc.gridy = 1;
		pCampos.add(lblUsuario,gc);
		gc.gridx = 1;
		gc.gridy = 1;
		pCampos.add(txtUsuario,gc);
		gc.gridx = 0;
		gc.gridy = 2;
		pCampos.add(lblSenha,gc);
		gc.gridx = 1;
		gc.gridy = 2;
		pCampos.add(pswSenha,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=2;
		gc.fill = GridBagConstraints.HORIZONTAL;
		pCampos.add(texto,gc);
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth=0;
		gc.fill=0;
		pImagem.add(lb,gc);
		
		//adiciona componentes ao gridlayout
		pBotoes.add(btnEntrar);
		pBotoes.add(btnCancelar);
		
		//adiciona componentes ao container.
		pNorte.add(pImagem);
		pNorte.add(pCampos);
		pCentro.add(pBotoes);
		c.add(pNorte,BorderLayout.NORTH);
		c.add(pCentro,BorderLayout.CENTER);
		
		//adiciona ouvintes nos componentes
		btnEntrar.addActionListener(controle);
		btnCancelar.addActionListener(controle);
		
		//faz o botão entrar ser o padrão
		btnEntrar.setDefaultCapable(true);
		JRootPane rp = fDialog.getRootPane();
		rp.setDefaultButton(btnEntrar);
		
		
		//mostra a Dialog
		fDialog.setTitle("Login SCC");
		fDialog.pack();
		fDialog.setLocationRelativeTo(null);
		fDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		fDialog.setVisible(true);
		
		
	}//fim do construtor




	public String pegaDados (){
		usuario = txtUsuario.getText();
		return usuario;
		
	}


	public void fechar (){
		fDialog.dispose();
		
	}


	public void mostra() {
		JOptionPane.showMessageDialog(null,"NOME :"+usuario);
	}
	
	 
}//fim da classe
Criado 11 de novembro de 2008
Ultima resposta 11 de nov. de 2008
Respostas 10
Participantes 5