publicListlistarLogradouros(){Connectionconn=null;PreparedStatementps=null;ResultSetrs=null;List<Logradouro>listaDeLogradouros=newArrayList<Logradouro>();try{Stringsql="select * from Logradouro";conn=this.con;ps=conn.prepareStatement(sql);rs=ps.executeQuery();while(rs.next()){Logradouroobjeto=newLogradouro();objeto.setId(rs.getInt(1));objeto.setDescricao(rs.getString(2));listaDeLogradouros.add(objeto);}}catch(SQLExceptionex){Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE,null,ex);}finally{FabricaDeConexoes.fecharConexao(conn,ps);}returnlistaDeLogradouros;}
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
publicListlistarLogradouros()throwsSQLException{Connectionconn=null;PreparedStatementps=null;ResultSetrs=null;List<Logradouro>listaDeLogradouros=newArrayList<Logradouro>();try{Stringsql="select * from Logradouro";conn=this.con;ps=conn.prepareStatement(sql);rs=ps.executeQuery();while(rs.next()){Logradouroobjeto=newLogradouro();objeto.setId(rs.getInt(1));objeto.setDescricao(rs.getString(2));listaDeLogradouros.add(objeto);}returnlistaDeLogradouros;//retorna a list após o término do laço while}catch(SQLExceptionex){Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE,null,ex);}finally{FabricaDeConexoes.fecharConexao(conn,ps);}}
Espero ter ajudado.
abraços
J
jcainelli
Você também pode dar o return dentro do cath e do finally.
B
Bruno_Laturner
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:
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
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!
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.
O codigo mais correto seria :
publicListlistarLogradouros(){Connectionconn=null;PreparedStatementps;try{Stringsql="select * from Logradouro";conn=this.con;ps=conn.prepareStatement(sql);ResultSetrs=ps.executeQuery();List<Logradouro>listaDeLogradouros=newArrayList<Logradouro>();while(rs.next()){Logradouroobjeto=newLogradouro();objeto.setId(rs.getInt(1));objeto.setDescricao(rs.getString(2));listaDeLogradouros.add(objeto);}returnlistaDeLogradouros;// retorno dentro do try}catch(SQLExceptionex){Logger.getLogger(LogradouroDao.class.getName()).log(Level.SEVERE,null,ex);thrownewDataAccessException(ex);// DataAccessException é uma RuntimeException de camada}finally{FabricaDeConexoes.fecharConexao(conn,ps);}}
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.