Dúvida - Try, Finaly [RESOLVIDO]

19 respostas
pedroroxd

Estou Fazendo um formulário de login.

try {   String sql2 = "Select nome, login, senha from cliente where login = '"+us+"' and senha = '"+pas+"' ";
    ResultSet rs = stmt.executeQuery(sql2);

    while(rs.next()) {
    String[] dados = new String[2];
    dados[0] = rs.getString("senha");
    dados[1] = rs.getString("nome");

    if (pas.equalsIgnoreCase(dados[0])) {
                 FramePrincipal ver = new FramePrincipal();
                 String nome = dados[1];
                 ver.escrevenome(nome);

                 JOptionPane.showMessageDialog(null, "Bem Vindo " + nome );
                new FramePrincipal().setVisible(true);

                 }
    }
 }

 finally {
        JOptionPane.showMessageDialog(null, "Senha Incorreta.");
    }

Ele dá certo. Quando a senha está errada, ele fala "Senha Incorreta".
Mas quando tá certa, ele abre o frame, fala "Bem Vindo", mas depois aparece "Senha Incorreta".
O que eu poderia colocar no lugar do finally?

19 Respostas

maxmustang

Tenta um if e else
pra cada uma das opcoes de login

:smiley:

xD

pedroroxd
maxmustang:
Tenta um if e else pra cada uma das opcoes de login

:D

xD

Eu tinha colocado isso...
Tava assim:

String sql2 = "Select nome, senha from cliente where login = '"+us+"' ";
ResultSet rs = stmt.executeQuery(sql2);

    while(rs.next()) {
    String[] dados = new String[2];
    dados[0] = rs.getString("senha");
    dados[1] = rs.getString("nome");

    if (pas.equalsIgnoreCase(dados[0])) {
                 FramePrincipal ver = new FramePrincipal();
                 String nome = dados[1];
                 ver.escrevenome(nome, us);

                 JOptionPane.showMessageDialog(null, "Bem Vindo " + nome );
                    ver.setVisible(true);
                 }
                 
    else {
JOptionPane.showMessageDialog(null, "Senha Incorreta.");
}

    }
 }
Mas ae ele só exibia "Senha Incorreta" se o login estivesse certo. Ex.: (Login = pedro, Senha = haha123).

Ele só exibiria "Senha Incorreta" se caso no login estivesse escrito "pedro". Caso tivesse escrito "kasdkasdk", "asdjasjdijasd" (login e senha inexistentes) ele não exibia nada.

Axo que o ideal seria um catch

maxmustang

Ahh
ta… foi mal
entendi outra coisa

blz…
o catch é nescessario mesmo
tenta ai
xD

pedroroxd

maxmustang:
Ahh
o catch é nescessario mesmo

Intão…
Só que precisa ter algo dentro do cath ex:

catch (Error ex) { // ALGO AKI // JOptionPane.showMessageDialog(null, "Senha Incorreta."); }

Mas eu não sei o que eu colocaria dentro do lugar que eu coloquei “Error ex”…

maxmustang

cara
nao sei se ajuda… mas da uma olhada aqui
http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/login/LoginException.html

:smiley:

Haskell

Tentou try / catch ?

mas if - else resolveria :stuck_out_tongue:

maxmustang

daria pra colocar o if/else dentro do finally tb né

pedroroxd

Haskell:
Tentou try / catch ?

mas if - else resolveria :stuck_out_tongue:

Lê os posts acima…
Eu ja tentei com if-else, mas não funciona… Olha o post acima que vc vai ver pq não funfa…
É com o catch que eu qro fazer msmo, mas não sei oq colocar dentro do ()

maxmustang

tenta uma sqlexception

francislon

Acho que sua lógica está incorreta. Você poderia fazer uma consulta em que vc retornaria a senha a partir do login digitado…Se a senha retornada for igual à senha digitada, você abre a janela senão vc mostra um erro.

Só pra esclarecer…o bloco try…catch…finally funciona da seguinte forma: Ele executa o conteúdo do try, se ocorrer alguma exceção ela é pegada em um determinado bloco catch, e o bloco finally SEMPRE é executado.

Espero que tenha ajudado.

pedroroxd

francislon:
Acho que sua lógica está incorreta. Você poderia fazer uma consulta em que vc retornaria a senha a partir do login digitado…Se a senha retornada for igual à senha digitada, você abre a janela senão vc mostra um erro.

Só pra esclarecer…o bloco try…catch…finally funciona da seguinte forma: Ele executa o conteúdo do try, se ocorrer alguma exceção ela é pegada em um determinado bloco catch, e o bloco finally SEMPRE é executado.

Espero que tenha ajudado.


Tá certo…

public void verilog (Connection connection, String us, String pas) throws SQLException  {

Aki ele recebe o usuário (us) e a senha (pas) do framesenha…
Ele tá funcionando… caso a senha esteja incorreta ele fala “Senha Incorreta”…
Caso esteja certa, ele abre o frame, fala bem vindo, mas logo depois fala “Senha Incorreta” (por causa do finaly, que sempre é executado)
O ideal seria fazer o catch… mas não sei como posso fazêlo… Seria:

catch (ALGUMA COISA AKI){ JOptionPane.showMessageDialog(null, "Senha Incorreta."); }

Ps: já tentei isso e não deu certo:

catch(SQLException ex) { JOptionPane.showMessageDialog(null, "Senha Incorreta."); }

francislon

Eu quis dizer algo parecido com isso:

select senha from clientes where login = 'voce';

O resultado da consulta acima vc compara com o conteudo digitado no campo senha do form de login.

if senhaVoltadaDoBanco.equals(conteudoDigitadoNoCampoDeSenhaDoForm){ MostraFrame(); }else{ MostraErro(); }

Entendeu?

F

Fala Pedro!

Voce pode fazer com a query do jeito que está, basta saber que se houver algum registro retornado a validação já ocorreu pela query… ou seja, se entrou no while é porque a senha está certa…

Abraço!!!

pedroroxd

felipe.brito87:
Fala Pedro!

Voce pode fazer com a query do jeito que está, basta saber que se houver algum registro retornado a validação já ocorreu pela query… ou seja, se entrou no while é porque a senha está certa…

Abraço!!!

Isso que eu acabei de pensar…
Mas como que eu valido se entrou no while ou não?

F

Você pode colocar uma variavel booleana, por exemplo “valido”, iniciada como false e trocar no final do while, testando apos este…

pedroroxd

FRANCISLON...
No caso seria:

String sql = "Select nome, login, senha from cliente where login = '"+us+"'"; // "us" é oq foi digitado no campo senha
    ResultSet rs = stmt.executeQuery(sql);

while(rs.next()) {
    String[] dados = new String[1];
    dados[0] = rs.getString("senha");      //Pegando a senha do banco de dados onde o usuário é "us"

     if (pas.equalsIgnoreCase(dados[0])) { //Se a senha digitada for igual ao que corresponde o usuário e a senha digitados{
   JOptionPane.showMessageDialog(null, "Senha correta");
}

else {
JOptionPane.showMessageDialog(null, "Senha errada");
}
}

Mas ele só vai entrar ae, se existir o usuário "us".
Caso não existir, ele nem vai exibir a mensagem "Senha errada".
Porque a validação está dentro do while. O que eu teria que validar é se entrou no while ou não

francislon

Então você verifica se o login digitado existe, se ele existir você verifica se a senha digitada correponde à senha armazenada no banco.

pedroroxd

Pessoal, deu certo...
valew ae felipe.brito87 e francislon....

ficou assim o código:

Statement stmt = connection.createStatement();
boolean k = false;
   String sql2 = "Select nome, login, senha from cliente where login = '"+us+"' and senha = '"+pas+"' ";
    ResultSet rs = stmt.executeQuery(sql2);

    while(rs.next()) {
    
    String[] dados = new String[2];
    dados[0] = rs.getString("senha");
    dados[1] = rs.getString("nome");
    if (pas.equalsIgnoreCase(dados[0])) {
                 FramePrincipal ver = new FramePrincipal();
                 String nome = dados[1];
                 ver.escrevenome(nome, us);

                 JOptionPane.showMessageDialog(null, "Bem Vindo " + nome );
                    ver.setVisible(true);
                       k = true;
                 }
    }

       if (k == false) {
      JOptionPane.showMessageDialog(null, "Senha Incorreta.");
       }
F

Sem grilo cara… estamos aqui para ajudar…

Gostaria de sugerir umas alterações…

Primeiro seria com relação ao if dentro do while… ele está um tanto redundante, uma vez que ele só vai trazer do BD o cara cuja senha foi digitada (lembrando que se você quiser que seja case insensitive vai precisar passar a variavel de senha da mesma maneira que gravou no BD, seja com toLowerCase() ou toUpperCase())…

A segunda seria com relação a mensagem de erro… note que “k==false” caso não exista o usuário ou a senha esteja inválida… logo o mais recomendável seria informar “Usuário ou Senha Incorreto(s)”… caso seja necessário discriminar qual foi o erro, então o mais aconselhado seria fazer como o francislon sugeriu, passar na query só o usuário e testar se achou alguém… e dentro do while manteria o if, incluindo um else para o caso de senha inválida…

Por último, uma dica só para deixar o código um pouco mais “elegante” seria colocar um nome relacionado ao papel da variável booleana e depois usar a negação para o teste, por exemplo:

boolean valido = false

//  ..........

if(!valido) {
     //.........
}

Qualquer dúvida posta aqui…

Abraço e sucesso!!!

Criado 5 de setembro de 2009
Ultima resposta 6 de set. de 2009
Respostas 19
Participantes 5