Java else语句错误

Java else语句错误,java,mysql,sql,if-statement,jdbc,Java,Mysql,Sql,If Statement,Jdbc,如果输入了错误的用户名和密码,JOptionPane框至少会出现3次。首先,这是一个很长的循环 我花了几个小时看代码,试图修改它,但没有运气。也不能得到太多帮助,但如果有人能指出或纠正我的错误,我将不胜感激 下面是我遇到问题的代码 try{ PreparedStatement ps = con.prepareStatement("SELECT Login, Password, Restriction FROM Users"); ResultSet r

如果输入了错误的用户名和密码,JOptionPane框至少会出现3次。首先,这是一个很长的循环

我花了几个小时看代码,试图修改它,但没有运气。也不能得到太多帮助,但如果有人能指出或纠正我的错误,我将不胜感激

下面是我遇到问题的代码

       try{
        PreparedStatement ps = con.prepareStatement("SELECT Login, Password, Restriction FROM Users");
        ResultSet rs = ps.executeQuery();
        while(rs.next()){
            if (username.equals(rs.getString("Login")) && password.equals(rs.getString("Password")) && ("Admin".equals(rs.getString("Restriction")))){
                this.setVisible(false);
                MainMenuAdmin admin = new MainMenuAdmin();
                admin.setVisible(true);
            }
            else if (username.equals(rs.getString("Login")) && password.equals(rs.getString("Password")) && ("Engineer".equals(rs.getString("Restriction")))){
                this.setVisible(false);
                MainMenuEngineer engineer = new MainMenuEngineer();
                engineer.setVisible(true);
            }
            else if (!username.equals(rs.getString("Login")) || !password.equals(rs.getString("Password"))){
              JOptionPane.showMessageDialog(null, "Login Failed");
            }
        }  
    }
    catch(SQLException sqle){
        sqle.printStackTrace();
    }

另外,如何对其进行编码,以便在用户名或密码不存在时,显示“用户名或密码不存在”?

您的方法存在很大缺陷。用错误的方法修复错误是没有意义的。请像这样更改您的查询

SELECT Restriction,ADD_requd_FIELDS…,FROM Users Login=?密码=?


如果
resultset
计数为
1
,则您拥有一个有效的用户。通过这种方式,您可以检查用户的身份验证,并从数据库中检索用户信息。你的方法不必要地过于复杂

你的方法是完全错误的

  • 您应该实际查询数据。使用您拥有的数据库
  • 您应该
    close()
    在使用完资源后关闭它们
  • 这是一种检查登录详细信息的方法。它从数据库中查询
    用户名
    密码

    public String checkLogin(final Connection con, final String username, final String password) throws SQLException {
        final String q = "SELECT Restriction FROM Users WHERE Login = ? AND Password = ?";
        try (final PreparedStatement ps = con.prepareStatement(q)) {
            ps.setString(1, username);
            ps.setString(2, password);
            try (final ResultSet rs = ps.executeQuery()) {
                if (!rs.next()) {
                    return "Invalid";
                }
                return rs.getString("Restriction");
            }
        }
    }
    
    你可以这样使用它:

    public void checkLogin() {
        try {
            final String loginResult = checkLogin(con, username, password);
            switch (loginResult) {
                case "Admin":
                    this.setVisible(false);
                    MainMenuAdmin admin = new MainMenuAdmin();
                    admin.setVisible(true);
                    return;
                case "Engineer":
                    this.setVisible(false);
                    MainMenuEngineer engineer = new MainMenuEngineer();
                    engineer.setVisible(true);
                default:
                    JOptionPane.showMessageDialog(null, "Login Failed");
            }
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        }
    }
    

    可能有三个用户。这就是窗格多次出现的原因。这是因为您迭代数据库中的每个用户,并在每次决策时更新GUI。您可以改为设置标志,并在循环后更新GUI。或者您完全改变了方法:使用准备好的语句查找输入的用户/密码/限制(您必须注意“SQL注入”!),并根据(一个)结果(如果有)确定限制。问题不在于else语句,而在于您的逻辑:1。为所有结果运行代码;2.您甚至不使用查询来筛选不应该匹配的条目;3.你打开了一个数据库游标,但从来没有关闭过。谢谢你。我尝试了这个,但是,在checkLogin方法中,它告诉我使用catch,因此,我无法返回“return rs.getString(“Restriction”)”。我不得不返回null。那次捕获把一切都毁了!我怎样才能解决这个问题。你是一个救生员和传奇人物!!!我正在使用Java7。catch子句破坏了代码lol。没有catch子句,我的程序无法编译。我该如何解决这个问题呢?然后代码在没有捕获的情况下编译;你错过了你的方法中的投掷条款吗?哦,是的,我错过了投掷条款,哎呀。我收到一个新错误,“连接关闭后不允许进行任何操作”。@user3138212该错误相当清楚。您的连接已关闭。