java if语句测试输出错误

java if语句测试输出错误,java,Java,我有一个连接到数据库后端的小java项目。我有一个登录函数,但当我把它放在我的测试工具中时,我无法让它给我正确的输出 public boolean validateLogin(User validate) { { Connection conn = null; String dbUserName = "root"; // MySQL database username String dbPassword =

我有一个连接到数据库后端的小java项目。我有一个登录函数,但当我把它放在我的测试工具中时,我无法让它给我正确的输出

public boolean validateLogin(User validate) {
        {
            Connection conn = null;

            String dbUserName = "root"; // MySQL database username
            String dbPassword = "nbuser"; // MySQL database password


            boolean returnValue = false;

            String dbUrl = "jdbc:mysql://localhost:3306/project";

            try {
                Class forNam = Class.forName("com.mysql.jdbc.Driver");

                try {

                    forNam.newInstance();
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                }
            } catch (ClassNotFoundException ex) {
            }

            try {

                conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
                System.out.println("Database connection establish...!");

                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM login_register WHERE user_id='" + validate.getUserID() + "'");
                if (rs.next()) {
                    if (rs.getString(2).equals(validate.getUserPassword())) {
                        System.out.println("User and Password Match");
                    } else {
                        System.out.println("No User Or Password Match");
                    }
                } 
                else {
                    System.out.println("No User Or Password Match");
                }

            } catch (SQLException ex) {
                System.out.println("Cannot connect to database server...!!");

            } finally {
                if (conn != null) {
                    try {

                        conn.close();
                        System.out.println("Database connection terminated...!!!");
                        returnValue = true;
                    } catch (SQLException ex) {
                    }
                }
            }
            return returnValue;

        }
    }
现在,我将测试代码以查看此语句是否有效

User testLogin = new User();
testLogin.setUserID("userid");
testLogin.setUserPassword("password");
 if (test.validateLogin(testLogin)) {
    System.out.println("User logged in");
} 
 else {
    System.out.println("Failed to login");
}
上述两位信息位于我的数据库中,因此我在IDE中的输出如下:

Database connection establish...!
User and Password Match
Database connection terminated...!!!
User logged in
但是如果我将值更改为数据库中没有的值,我会得到

Database connection establish...!
No User Or Password Match
Database connection terminated...!!!
User logged in
所以问题是在我的测试代码中,当值不匹配时,我不能说它们不匹配,这是我以后工作中需要的函数。
如果在我的测试端id和密码不匹配,我需要在测试代码上更改什么才能说
“登录失败”
,这是您遇到问题的一部分:

        } finally {
            if (conn != null) {
                try {

                    conn.close();
                    System.out.println("Database connection terminated...!!!");
                    //delete the next line:
                    //returnValue = true; // <-- in a finally block, this will always run...
试试这个

if (rs.getString(2).equals(validate.getUserPassword())) {
        System.out.println("User and Password Match");
        returnValue =true;
                    } else {
        System.out.println("No User Or Password Match");
         returnValue =false;
                    }

并删除
returnValue=true
from finally block

成功状态不取决于“我可以连接到数据库吗”,但如果密码不匹配,则应设置成功状态

            if (rs.next()) {
                if (rs.getString(2).equals(validate.getUserPassword())) {
                    System.out.println("User and Password Match");
                    returnValue = true; // <---
                } else {
                    System.out.println("No User Or Password Match");
                }
            } 
            else {
                System.out.println("No User Or Password Match");
            }
if(rs.next()){
if(rs.getString(2).equals(validate.getUserPassword())){
System.out.println(“用户和密码匹配”);

returnValue=true;//您的方法中存在一些问题:

  • 您应该将代码放在一个try/catch块中。按照您放置代码的方式,如果第一个try块中的代码
    Class-forNam=Class.forName(“com.mysql.jdbc.Driver”);
    失败,第二个try块仍将被执行,这将导致由于无法打开连接而产生的异常

  • finally()块确保方法始终返回true。应将
    returnValue=true;
    块与“用户和密码匹配”场景一起放置在
    if(rs.getString(2).equals(validate.getUserPassword()){
    块中


  • 您的方法总是返回true。嗯,实际上几乎总是。因为您在finally子句中将返回值设置为
    true
    。您期望得到什么?隐藏异常(捕获异常而不处理异常)这总是一个坏主意。至少要记录它们。如果你不知道如何处理该异常,请重试。我个人会先对登录代码做一些工作。也许重新开始,一次构建一个功能,然后在运行时进行测试。该代码是……嗯,它需要工作。让我说,你的代码非常容易受到SQL攻击注入攻击。您应该使用“准备好的语句”(prepared statements)来避免这种情况。此外,您没有关闭
    语句
    结果集
    对象。这可能会在特定时间导致内存泄漏。并且:不要以纯文本形式传输密码。
                if (rs.next()) {
                    if (rs.getString(2).equals(validate.getUserPassword())) {
                        System.out.println("User and Password Match");
                        returnValue = true; // <---
                    } else {
                        System.out.println("No User Or Password Match");
                    }
                } 
                else {
                    System.out.println("No User Or Password Match");
                }