Banco de Dados + Exception (Resolvido)

Amigos… me tirem uma dúvida eu chamo o seguinte comando…

CadastroDAO dao = new CadastroDAO(); dao.consultarRegistro(cadastro);

chama o seguinte código:

[code]public void consultarRegistro(ModelCadatro cadastro) throws Exception {

    PreparedStatement psmt = ConexaoDAO.getConnection().prepareStatement("Select * from cadastro where nome=?");
    psmt.setString(1, cadastro.getNome());
    ResultSet rs = psmt.executeQuery();
    
    while (rs.next()) {
        cadastro = new ModelCadatro ();
        cadastro.setRegistro(rs.getString("ID"));
        cadastro.setNome(rs.getString("Nome"));
        cadastro.setCep(rs.getString("cep").replace("-", ""));
    }
}[/code]

a minha dúvida é quando retorna para o primeiro código se não encontrar nada ele mantem o nome que foi colocado, tem como retornar o null?

porque não coloca numa List, assim você só adiciona quantos encontrar caso contrario tera uma lista vazia ?

então… essa consulta jamais retornará uma lista, sempre será um registro único… tem como fazer isso?

Porque você não checa se o seu ResultSet esta retornando alguma coisa, se sim , você entra no seu next senão sai fora dele e vai para aonde você quer ir … se é que eu entendo o que vc quer fazer …

Você está usando a mesma instância para buscar e para retornar o registro. Utilize uma instância diferente e altere o retorno do método. E se você busca apenas por um registro deve usar um if ao invés de while. Assim:

[code]public ModelCadatro consultarRegistro(ModelCadatro cadastro) throws Exception {

    PreparedStatement psmt = ConexaoDAO.getConnection().prepareStatement("Select * from cadastro where nome=?");  
    psmt.setString(1, cadastro.getNome());  
    ResultSet rs = psmt.executeQuery();  

    ModelCadatro cadastroRetorno = null;           

    if(rs.next()) {  
        cadastroRetorno = new ModelCadatro ();  
        cadastroRetorno.setRegistro(rs.getString("ID"));  
        cadastroRetorno.setNome(rs.getString("Nome"));  
        cadastroRetorno.setCep(rs.getString("cep").replace("-", ""));  
    }  
    return cadastroRetorno;
} 

[/code]

E não entendi onde entra a Exception do título do post.

Só colocar o if pra consultar e se for o nome retorna null…

Frederico, acho que ele quer retornar null pra simular uma exception…

himorrivel, se for isso explique melhor sua idéia pq não é uma boa prática fazer isso…

“acho que ele quer retornar null pra simular uma exception”

a minha ideia é isso mesmo… se retornar “null” eu coloco uma exception informando que nada foi encontrado…

se isso não é uma boa… o que seria uma boa neste caso? caso não retorne nada?

MAnde uma msg, chame outro método, até use o System.out.println(), mas vc vai gerar um custo pro sistema lançar uma exception só pra avisar???

Exception é para erros, não para mandar msg (claro que vc pode mandar msg tmb), mas explique melhor seu código, ou poste ele, que a gente ajuda a te dar uma idéia melhor…

Pelo menos na minha cabeça não entra isso de lançar exception só pra dar avisos.

Não sei o que o resto do pessoal acha.

[quote=diogogama]MAnde uma msg, chame outro método, até use o System.out.println(), mas vc vai gerar um custo pro sistema lançar uma exception só pra avisar???

Exception é para erros, não para mandar msg (claro que vc pode mandar msg tmb), mas explique melhor seu código, ou poste ele, que a gente ajuda a te dar uma idéia melhor…

Pelo menos na minha cabeça não entra isso de lançar exception só pra dar avisos.

Não sei o que o resto do pessoal acha.[/quote]

Só para lembrar, try/catch não são if/else…

Na verdade não é uma má prática lançar uma exception neste caso. A própria JPA e o Hibernate fazem isso quando não encontram o registro.

Você pode criar uma NoResultException por exemplo e caso não encontre nada, lançá-la.

[code]public ModelCadatro consultarRegistro(ModelCadatro cadastro) throws Exception {

    PreparedStatement psmt = ConexaoDAO.getConnection().prepareStatement("Select * from cadastro where nome=?");    
    psmt.setString(1, cadastro.getNome());    
    ResultSet rs = psmt.executeQuery();    

    ModelCadatro cadastroRetorno = null;             

    if(rs.next()) {    
        cadastroRetorno = new ModelCadatro ();    
        cadastroRetorno.setRegistro(rs.getString("ID"));    
        cadastroRetorno.setNome(rs.getString("Nome"));    
        cadastroRetorno.setCep(rs.getString("cep").replace("-", ""));    

        return cadastroRetorno; 
    }    
    
   throw new NoResultException("Nenhum registro encontrado.");
}   [/code]

Aconse-lho faze-la extendendo de RuntimeException e não de Exception. Deixando o tratamento opcional.

[quote=diogogama]MAnde uma msg, chame outro método, até use o System.out.println(), mas vc vai gerar um custo pro sistema lançar uma exception só pra avisar???

Exception é para erros, não para mandar msg (claro que vc pode mandar msg tmb), mas explique melhor seu código, ou poste ele, que a gente ajuda a te dar uma idéia melhor…

Pelo menos na minha cabeça não entra isso de lançar exception só pra dar avisos.

Não sei o que o resto do pessoal acha.[/quote]

Exception não é para erros. Podem ser usadas para caminhos excepcionais, ou seja, que não seguem o fluxo padrão. Até fazendo uma analogia aos RUP e seus casos de uso. O fluxo padrão seria buscar o registro e retorná-lo. Caso não encontre o sistema deve seguir um fluxo diferente, ou abortar o fluxo, e a exceção pode ser usada para isto.

[quote=fredericomaia10][quote=diogogama]MAnde uma msg, chame outro método, até use o System.out.println(), mas vc vai gerar um custo pro sistema lançar uma exception só pra avisar???

Exception é para erros, não para mandar msg (claro que vc pode mandar msg tmb), mas explique melhor seu código, ou poste ele, que a gente ajuda a te dar uma idéia melhor…

Pelo menos na minha cabeça não entra isso de lançar exception só pra dar avisos.

Não sei o que o resto do pessoal acha.[/quote]

Exception não é para erros. Podem ser usadas para caminhos excepcionais, ou seja, que não seguem o fluxo padrão. Até fazendo uma analogia aos RUP e seus casos de uso. O fluxo padrão seria buscar o registro e retorná-lo. Caso não encontre o sistema deve seguir um fluxo diferente, ou abortar o fluxo, e a exceção pode ser usada para isto.[/quote]

Desculpe frederico, mas ao meu ver não me parece uma boa prática usar uma exception apenas para mudar o fluxo, para isso existe if/else…

Temos que entender que as exceptions geram um custo, e muito grande, para a aplicação…

Só me desculpa se eu deixei a entender que ela só serve para erros, não quis dizer isso, porém não acho que seja a melhor resposta pro problema dele, e nem para “apenas” mudar um fluxo de lógica.

Vlw.

[quote]What Is an Exception?
The term exception is shorthand for the phrase “exceptional event.”
Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program’s instructions.[/quote]
Fonte: http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html.

Essa é a definição. É claro que não devem ser usadas a torta e a direita. As exceções ao meu ver são partes fundamentais em uma arquitetura e devem ser bem planejadas. E neste caso poderia ser usada, como já mencionei, assim como é feito na JPA e no Hibernate quando um registro não é encontrado. Neste caso estamos abortando o fluxo, não desviando. Controlar o fluxo com exceptions não é algo legal.

Então, amigo, interrompe, não redireciona, é um erro do sistema, não mudança de lógica, ou de fluxo…

Como fala a definição “interrompe”…

Quando vc vai consultar uma lista de cadastro e a mesma não tem nenhum cadastro ela não interrompeu o funcionamento, ela fez o que era completamente esperado.

Não me parece certo vc falar assim:

Quando tem 1, retorne 1.
Quando tem 10, retorne 10.
Quando tem 20, retorne 20.
E quando tem 0, retorne uma exceção.

Entende???

Acredito que uma solução mais elegante seria retornar a mensagem ou um 0, sem lançar exceção, pq o programa não teve “interrupções”.

vlw.

[quote=fredericomaia10]Você está usando a mesma instância para buscar e para retornar o registro. Utilize uma instância diferente e altere o retorno do método. E se você busca apenas por um registro deve usar um if ao invés de while. Assim:

[code]public ModelCadatro consultarRegistro(ModelCadatro cadastro) throws Exception {

    PreparedStatement psmt = ConexaoDAO.getConnection().prepareStatement("Select * from cadastro where nome=?");  
    psmt.setString(1, cadastro.getNome());  
    ResultSet rs = psmt.executeQuery();  

    ModelCadatro cadastroRetorno = null;           

    if(rs.next()) {  
        cadastroRetorno = new ModelCadatro ();  
        cadastroRetorno.setRegistro(rs.getString("ID"));  
        cadastroRetorno.setNome(rs.getString("Nome"));  
        cadastroRetorno.setCep(rs.getString("cep").replace("-", ""));  
    }  
    return cadastroRetorno;
} 

[/code]

E não entendi onde entra a Exception do título do post. [/quote]

faz como o frederico recomendou aqui, aí no seu controller vc verifica se é null, se for vc cria a regra que quiser…

Me pareceu o meis sensato e elegante.

vlw.

[quote=diogogama]Não me parece certo vc falar assim:
Quando tem 1, retorne 1.
Quando tem 10, retorne 10.
Quando tem 20, retorne 20.
E quando tem 0, retorne uma exceção.

Entende???

Acredito que uma solução mais elegante seria retornar a mensagem ou um 0, sem lançar exceção, pq o programa não teve “interrupções”.

vlw.[/quote]

Não generalize. Cada caso é um caso. Eu costumo retornar null, mas caso seja uma regra de negócio já analiso melhor e pode ser o caso de usar uma exception.
Você teria o que então? Um método que busca um objeto e retorna uma String? Um Integer?

public String consultarRegistro(ModelCadatro cadastro) {  

?

No ActiveRecord do Rails por exemplo, se buscar um registro e o mesmo não é encontrado você opta pelo retorno de nil (análogo ao null) ou lançamento de uma exceção.

Claro que não.

retornar null é, a meu ver, a melhor opção.

MAs como vc disse, isso de um modo geral, porém concordo que existam casos que devem ser analisados com mais cuidado, porém de um modo geral não me pareceu certo…

Acho que finalmente concordamos… rs…

Agora tem que ver se o rapaz entendeu o que dissemos… rs…

Faz como dei o exemplo do frederico que está bom.

[quote=diogogama]
MAs como vc disse, isso de um modo geral, porém concordo que existam casos que devem ser analisados com mais cuidado, porém de um modo geral não me pareceu certo…

Acho que finalmente concordamos… rs…

Agora tem que ver se o rapaz entendeu o que dissemos… rs…

Faz como dei o exemplo do frederico que está bom.[/quote]

Isso aí. =)

Opa! Adorei a discussão, acho que me acrescentou muito rss… entao… vou fazer conforme dito um pouco ali atras… vou fazer a busca e tudo se voltar vazio, neste caso… no proprio controller eu lanço a exception… obrigado pela ajuda… vou fazer aqui e se eu tiver algum problema eu os chamo novamente rs…

Abraços!