如果condtions通过,else语句仍然会运行

时间:2018-06-01 21:46:54

标签: java database sqlite if-statement

我遇到问题让我的if else语句正常工作,这里我有一个使用数据库中的值的表单登录。 Employee角色的语句工作正常但即使else if语句传递else语句仍然运行。

如果有助于对话框在Customer语句通过时出现两次,如果else自行运行则出现三次。如果我的代码格式不合适,我很抱歉。我在这里发布代码时很新。

 private void jBtnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // action performed when the login button is pressed
    // variables that will contain the row entries to the login data base (user name)
    String userNameDb = "";            
    roleDb = rs.getString("role");
    //database connection code
    try
    {      
   Class.forName("org.sqlite.JDBC");
   con = DriverManager.getConnection("//database directory");       
   st=con.createStatement();
   //selects entries from the userName password and role row from the user table
   rs=st.executeQuery("Select userName, role From tblUser ;");        

   //loops through the table entires
    while(rs.next())
    {    
        //assigns database entry to variables        
        userNameDb = rs.getString("userName");
        roleDb = rs.getString("role");

    if (jTxtUserName.getText().equals(userNameDb) && roleDb.equals("Customer"))             
    {
        //switch forms
        break;
    }
    //if the users input and role match the data base for an customer send them to the selection form
    else if (jTxtUserName.getText().equals(userNameDb) && roleDb.equals("Customer")) 
    {
       //switch forms           
       break;
    }
    else
    {
        JOptionPane.showMessageDialog(null, "Login failed");

    }
        }
    }
        catch(Exception ex)
    {
        System.out.println("" + ex); 
    }          
  }
} 

1 个答案:

答案 0 :(得分:2)

问题是您的while循环编码错误,因为您的"登录失败" JOptionPane else块不应该在while循环内。而是在循环之前声明一个布尔值,将其设置为false,检查是否在该循环中找到用户名/密码,如果是,则将布尔值设置为true。然后循环之后检查布尔值,如果为false,则显示错误消息。

要了解原因,请使用调试器来运行代码,以了解它为什么会按照其行为方式运行。更重要的是,学习"橡皮鸭"调试技术,您可以在心理上或书面上浏览代码,告诉鸭子每行代码应该做什么。

为了说明,您的代码的行为类似于下面的代码,其中布尔数组模仿您的密码用户名检查。当然,您使用的是while循环,而不是for循环,但这里使用的是使示例更简单:

private someActionPerformedMethod() {
    // boolean representing when the username/password test is OK
    boolean[] loopItems = { false, false, false, true, false };
    for (boolean loopItem : loopItems) {
        if (loopItem) {
            break;
        } else {
            JOptionPane.showMessageDialog(null, "Login failed");
        }
    }
}

假设密码/用户名仅在第4次尝试时匹配(第4项为true),则对于每次失败的检查,JOptionPane将显示登录失败。你想要的是:

private someActionPerformedMethod() {
    // boolean representing when the username/password test is OK
    boolean[] loopItems = { false, false, false, true, false };
    boolean userFound = false;

    // you'll of course be using a while loop here
    for (boolean loopItem : loopItems) {
        if (loopItem) {
            userFound = true;
            // do something with user data
            break;              
        }
    }
    if (!userFound) {
        JOptionPane.showMessageDialog(null, "Login failed");
    }
}