我遇到问题让我的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);
}
}
}
答案 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");
}
}