StackOverflowError SOCORRO!

2 respostas
D

Pessoal o seguinte… ja to ficando careca.
Vamos la… estou construindo meu primeiro sistema usando dao etc…
Está dando um erro de StackOverflowError… nao sei pq.
Queria aproveitar para tirar uma dúvida… esta implementacao esta correta ?
O cod. segue abaixo… por favor alguem ajude !!! :slight_smile:

Desde já muito obrigado a todos !!!

UsuariosDb…

package br.com.nerd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import br.com.nerd.beans.UsuarioBean;
import br.com.nerd.util.NerdException;

public class UsuariosDb implements UsuariosDao{

    public final String INSERT = "INSERT INTO usuarios (nome_usuario,email_usuario) VALUES (?,?)";
    public final String SELECT_BYID = "SELECT nome_usuario,email_usuario FROM usuarios WHERE id_usuario = ?";
    
    public void gravarUsuario(UsuarioBean u) throws NerdException {
    
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement prepStmt = null;
        
        try{
            conn = ConnectionManager.getConexao();
            prepStmt = conn.prepareStatement(INSERT);
            prepStmt.setString(1,u.getNome());
            prepStmt.setString(2,u.getEmail());
            prepStmt.execute();
        } catch (SQLException e) {
            String msg = "[ProdutosDB][save(Produto p)]: " + e.getMessage();
            NerdException ge = new NerdException(msg, e);
            ge.print();
            throw ge;
        } finally {
            ConnectionManager.closeAll(conn, prepStmt, rs);
        }

    }
    
    public UsuarioBean getUsuarioById(int id) throws NerdException {

        Connection conn = null;
        PreparedStatement prepStmt = null;
        ResultSet rs = null;
        UsuarioBean oUsuario = null;

        try {
            conn = ConnectionManager.getConexao();
            prepStmt = conn.prepareStatement(SELECT_BYID);
            prepStmt.setInt(1, id);
            rs = prepStmt.executeQuery();
            if (rs.next()) {
                String nome = rs.getString("nome_usuario");
                String email = rs.getString("email_usuario");
                oUsuario = new UsuarioBean(nome,email);
            }
            return oUsuario;
        }
        catch (SQLException e) {
            String msg = "[ProdutosDB][getProdutoById()]: " + e.getMessage();
            NerdException ge = new NerdException(msg, e);
            ge.print();
            throw ge;
        } finally {
            ConnectionManager.closeAll(conn, prepStmt, rs);
        }

    }    
    
}

ConnectionManager…

package br.com.nerd.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import br.com.nerd.util.NerdException;

public class ConnectionManager {

    private static final String STR_DRIVER = "org.gjt.mm.mysql.Driver";
    private static final String DATABASE = "jnerd";
    private static final String IP = "localhost";
    private static final String STR_CON = "jdbc:mysql://"+IP+":3306/" + DATABASE;
    private static final String USER = "root";
    private static final String PASSWORD = "senha";

    public static Connection getConexao() throws NerdException {
        
        Connection conn = null;
        
        try {
            Class.forName(STR_DRIVER);
            conn = DriverManager.getConnection(STR_CON,USER,PASSWORD);
            System.out.println("[ConnectionManager]: Obtendo conexao");
            return conn;
        }
        catch (ClassNotFoundException e) {
            String errorMsg = "Driver nao encontrado";
            throw new NerdException(errorMsg, e);
        } catch (SQLException e) {
            String errorMsg = "Erro ao obter a conexao" +e;
            throw new NerdException(errorMsg, e);
        }
        
    }

    public static void closeAll(Connection conn) {
        
        try {
            if(conn!=null){
                conn.close();
            }
        } catch (Exception e) {
            String errorMsg = "Nao foi possivel fechar a conexao com o banco";
            NerdException.print(e, errorMsg);
        }
    
    }
    
    public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
    
        try {
            if(conn!=null || stmt!=null){
                closeAll(conn,stmt);
            }
            if(rs!=null){
                rs.close();
            }
        } catch (Exception e) {
            String errorMsg = "Nao foi possivel fechar o resultSet do banco";
            NerdException.print(e, errorMsg);
        }
    
    }
        
    public static void closeAll(Connection conn, Statement stmt) {
    
        try {
            if(conn!=null){
                closeAll(conn);
            }
            if(stmt!=null){
                stmt.close();
            }
        } catch (Exception e) {
            String errorMsg = "Nao foi possivel fechar a statement do banco";
            NerdException.print(e, errorMsg);
        }
    
    }

    public static void main(String args[]) {
    
        Connection conn = null;
        try {
            conn = ConnectionManager.getConexao();
        } catch (NerdException ge) {
            ge.print();
        } finally {
            closeAll(conn);
        }
    
    }

}

UsuariosDao…

package br.com.nerd.dao;

import br.com.nerd.beans.UsuarioBean;
import br.com.nerd.util.NerdException;

public interface UsuariosDao {

    public void gravarUsuario(UsuarioBean u) throws NerdException;
    public UsuarioBean getUsuarioById(int id) throws NerdException;
    
}

UsuarioBean…

package br.com.nerd.beans;

public class UsuarioBean {

    private int idusuario;
    private String nome;
    private String email;
    
    public UsuarioBean(String nome, String email){
        this.nome = nome;
        this.email = email;
    }
    
    public UsuarioBean(int idUsuario, String nome, String email){
        this(nome,email);
        this.idusuario = idUsuario;
    }
    
    public int getIdUsuario(){
        return this.idusuario;
    }

    public void setIdUsuario(int idUsuario){
        this.idusuario = idUsuario;
    }

    public String getNome(){
        return this.getNome();
    }
    
    public void setNome(String nome){
        this.nome = nome;
    }
    
    public String getEmail(){
        return this.email;
    }
    
    public void setEmail(String email){
        this.email = email;
    }
    
}

jsp…

<%

	int id = 1;
	UsuariosDao user = new UsuariosDb();
	UsuarioBean userBean = new UsuarioBean("","");
	userBean = (UsuarioBean) user.getUsuarioById(id);
	
	out.println(userBean.getNome());
	%>

O erro…

javax.servlet.ServletException
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:91)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.StackOverflowError
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
	br.com.nerd.beans.UsuarioBean.getNome(UsuarioBean.java:28)
        .................................. e por ai vai.......

2 Respostas

J

Olá,

Kra… o código parece estar certo, o único problema é aqui:

public String getNome(){ 
        return this.getNome(); 
    }

O certo seria:

public String getNome(){ 
        return this.nome; 
    }

O StackOverflow aconteceu porque você fica chamando a mesma função recursivamente…

Flw…

D

Putz verdade jonlordbr… falta de atencao eh foda.
Mas e de resto ?? O conceito e a implementacao estao corretos ?? Tem alguma coisa que possa ser melhorada ??

Valeu !!
Daniel Bertini

Criado 11 de março de 2005
Ultima resposta 14 de mar. de 2005
Respostas 2
Participantes 2