Retorno de List em DAO

12 respostas
5

Olá pessoal,

Estou com um probleminha, só consigo retornar meu Lista de um DAO quando o mesmo está fora do try{}catch{}. Se alguém puder me explicar o motivo, eu agradeço.
public List listarLogradouros(){
        
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Logradouro> listaDeLogradouros = new ArrayList<Logradouro>();
        
        try {            
            String sql = "select * from Logradouro";
            conn = this.con;
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
                        
            while(rs.next()){
                Logradouro objeto = new Logradouro();
                objeto.setId(rs.getInt(1));
                objeto.setDescricao(rs.getString(2));
                listaDeLogradouros.add(objeto);
            }
        } catch (SQLException ex) {
            Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE, null, ex);
        }finally{              
            FabricaDeConexoes.fecharConexao(conn, ps);
        }
      return listaDeLogradouros;
    }

12 Respostas

Eudes

Olá, um tempo atrás eu tive um problema em um DAO e vim buscar a ajuda aqui. O victorwss
me deu algumas sugestões, e as uso desde então.

faça seu método lançar exceções colocando a clausula throws nesse casso SQLExcpetion e ele não vai dar erro se vc retornar a list depois do bloco laço while

public List listarLogradouros() throws SQLException {

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Logradouro> listaDeLogradouros = new ArrayList<Logradouro>();

        try {
            String sql = "select * from Logradouro";
            conn = this.con;
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                Logradouro objeto = new Logradouro();
                objeto.setId(rs.getInt(1));
                objeto.setDescricao(rs.getString(2));
                listaDeLogradouros.add(objeto);
            }
            return listaDeLogradouros; //retorna a list após o término do laço while
        } catch (SQLException ex) {
            Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            FabricaDeConexoes.fecharConexao(conn, ps);
        }
    }

Espero ter ajudado.
abraços

J

Você também pode dar o return dentro do cath e do finally.

B

catch é para tratamento de exceções. finally é para fechar recursos independente do fluxo que o programa toma.

Sim, é possível dar return dentro deles, mas não é recomendado.

ralphsilver

o motivo de não funcionar é porque a classe precisa retornar alguma coisa. Se vc apenas colocar o retorno no try, ele vai dar erro porque dependendo da situação a classe não consiga retornar:

errado
public boolean function(){
     try{

         return true;
    }catch(Exception e){
  
    }
}

vc pode ver que, dependendo da resposta da classe, caso caia no catch, ele fica sem retorno.

O mais viável é vc fazer um throw e caso precise realmente de um try catch, sugiro qeu faça assim:

public boolean function() throws Exception{
     try{

         return true;
    }catch(Exception e){
         throw e;
    }finally{
    }
}
B

Bem lembrado. Se a exceção for tratada localmente, o código pode muito bem ir p/ um lado onde ele não retorna um valor. O compilador do java analisa todas as opções de fluxo do método, e todas precisam retornar algo caso o método não seja void.

Fabio_Kym_Nascimento

Coloca o return fora do bloco try…catch se não der erro o sistema vai retornar o valor desejado, se der erro ele para e realiza a ação do catch e retorna pra quem chamou o método, o que pode ser outro método ou em último caso o main que retorna a ação para o usuário.

sergiotaborda
  1. Não existe nada fora de um block try-catch a menos que haja uma muito boa razão. Return não é uma boa razão.
    O return fica dentro do try sempre!
  2. Não é boa prática consumir uma exceção em um log quando o objecto não é o mais exterior do sistema. O DAO é o mais exterior da camada, mas não do sistema. O correto é encapsular a exceção em uma exceção de camada e lançar essa.
    Loggar e relançar a mesma exceção é má prática.
  3. O codigo mais correto seria :
public List listarLogradouros(){
        
        Connection conn = null;
        PreparedStatement ps;

        try {            
            String sql = "select * from Logradouro";
            conn = this.con;
            ps = conn.prepareStatement(sql);
            ResultSet rs  = ps.executeQuery();
                        
           List<Logradouro> listaDeLogradouros = new ArrayList<Logradouro>();
        
            while(rs.next()){
                Logradouro objeto = new Logradouro();
                objeto.setId(rs.getInt(1));
                objeto.setDescricao(rs.getString(2));
                listaDeLogradouros.add(objeto);
            }
            return listaDeLogradouros; // retorno dentro do try
        } catch (SQLException ex) {
            Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE, null, ex);
            throw new DataAccessException(ex); // DataAccessException é uma RuntimeException de camada
        }finally{              
            FabricaDeConexoes.fecharConexao(conn, ps);
        }
    
    }

mais info aqui

B

Sérgio, é uma boa idéia trocar uma exceção verificada por uma não-verificada?

victorwss

Se a causa for alguma falha improvável para a qual não existe remédio que não seja falhar, dar uma mensagem de erro e gerar log ou for um erro de programação, então uma exceção verificada só iria irritar.

sergiotaborda

Dê uma lida no link que passei antes.
Exceções verificadas devem ser usadas quando a camada comunica com recursos fora do sistema. Por isso que IOException e SQLException são verificadas. Para exceções internas ao sistema não ha grande vantagem em usar exceções verificadas.
Repare que se a camada mais baixa não conseguiu resolver o problema é improvável que a mais superior possa. Claro que se poder ainda tem a opção de capturar a exceção não verificada, logo não ha nada a perder. O seu código fica mais simples, mas o poder de capturar a exceção continua.

Exceções verificadas são boas apenas para camadas muito baixas ou exteriores.

5

sergiotaborda,

Seu código está praticamente igual ao meu, a única diferença é que você retornou a List dentro do try, o problema é que se eu como você fez, o método alega que não está retornando nada.
victorwss

504843:
sergiotaborda,

Seu código está praticamente igual ao meu, a única diferença é que você retornou a List dentro do try, o problema é que se eu como você fez, o método alega que não está retornando nada.</blockquote>

Coloque um throw no final do catch.

Criado 18 de outubro de 2008
Ultima resposta 20 de out. de 2008
Respostas 12
Participantes 8