Java while循环多次返回错误消息
我有一个登录页面,当输入登录详细信息时,while循环访问数据库以验证输入,但如果我在数据库中有3条记录且输入不正确,则错误消息显示3次,如果输入正确,则错误消息显示两次。我知道为什么会发生这种情况(由于while循环),但我不知道如何抵消这种情况。代码如下:Java while循环多次返回错误消息,java,jdbc,database-connection,Java,Jdbc,Database Connection,我有一个登录页面,当输入登录详细信息时,while循环访问数据库以验证输入,但如果我在数据库中有3条记录且输入不正确,则错误消息显示3次,如果输入正确,则错误消息显示两次。我知道为什么会发生这种情况(由于while循环),但我不知道如何抵消这种情况。代码如下: package securitySystem; import java.awt.*; import javax.swing.*; import java.sql.*; import java.awt.event.*; public c
package securitySystem;
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import java.awt.event.*;
public class loginPage extends JFrame {
public static void main (String args[]){
loginPage gui= new loginPage ();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setVisible(true);
gui.setTitle("Login Page");
}
JLabel lblUserName= new JLabel("UserName:");
JTextField txtUserName= new JTextField(15);
JLabel lblPassword= new JLabel("Password:");
JTextField txtPassword= new JTextField(15);
JButton btnForgotten= new JButton("Forgotten Login");
JButton btnLogin= new JButton("Login");
public loginPage (){
setLayout (null);
//JLabel lblUserName= new JLabel("UserName:");
lblUserName.setBounds(100,100,110,30);
add(lblUserName);
//JTextField txtUserName= new JTextField(15);
txtUserName.setBounds(170,100,110,30);
add(txtUserName);
//JLabel lblPassword= new JLabel("Password:");
lblPassword.setBounds(100,150,110,30);
add(lblPassword);
//JTextField txtPassword= new JTextField(15);
txtPassword.setBounds(170,150,110,30);
add(txtPassword);
//JButton btnLogin= new JButton("Login");
btnLogin.setBounds(100,300, 70, 30);
add(btnLogin);
actionlogin();
//JButton btnForgotten= new JButton("Forgotten Login");
btnForgotten.setBounds(175,300, 130, 30);
add(btnForgotten);
}
public void actionlogin()
{
btnLogin.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String username = txtUserName.getText();
String password = txtPassword.getText();
String databaseUsername = "";
String databasePassword = "";
String dataSourceName = "securitySystem";
String dbUrl = "jdbc:odbc:" + dataSourceName;
try{
//Type of connection driver used
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//Connection variable or object param: dbPath, userName, password
Connection con = DriverManager.getConnection(dbUrl, "", "");
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("select username, password from employee");
while(rs.next())
{
if(username.equals(rs.getString("username")) && password.equals(rs.getString("password")))
{
adminMenu gui =new adminMenu();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setVisible(true);
dispose();
}
else
{
JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
txtUserName.setText("");
txtPassword.setText("");
txtUserName.requestFocus();
}
}
statement.close();
con.close();
}catch (Exception e) {
try {
throw e;
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
}
}您需要添加一个
中断代码>语句以在失败后退出循环
else
{
JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
txtUserName.setText("");
txtPassword.setText("");
txtUserName.requestFocus();
break; // <-- this is needed
}
你应该用一个标志来解决这个问题,它比中断
更干净
boolean nomatches=true;
while(rs.next())
{
if(username.equals(rs.getString("username")) && password.equals(rs.getString("password")))
{
adminMenu gui =new adminMenu();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setVisible(true);
dispose();
nomatches=false;
}
}
if(nomatches) {
JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
txtUserName.setText("");
txtPassword.setText("");
txtUserName.requestFocus();
}
我认为,除了“中断”声明之外,你还有一个逻辑错误。您说过“如果输入正确,错误信息将显示两次”。因此,我们需要退出循环或停止对成功的迭代,因此在成功案例中添加一个“break”语句。如果您不想中断循环,那么可以简单地使用“continue”和标志变量。如果案例成功,请将标志更新为1。(记得在创建时将标志初始化为0)。在继续进行成功案例之前,检查flag的值,根据它的不同,中断或继续下一次迭代。Hm,我不明白为什么要用这种方式检查登录。使用另一个sql查询更方便:
'select count(*) from employee where username = @username and password = @password'
用输入值替换@username
和@password
,如果语句的结果为0,则输入不正确,如果结果为1,则输入正确
使用此解决方案,您不需要while循环 太好了,我知道这是一个简单的解决办法。我改变了它,但没有把最后一个放进去@Adam是的,else
在我的示例中强调了接下来会发生什么。它在实际代码中不是必需的。
'select count(*) from employee where username = @username and password = @password'