Java .equals() 在字符串相等时返回 false

标签 java android string equals

我正在制作一个应用程序,如果用户已经登录,我希望该应用程序从文本文件自动登录。目前,在文本文件中我有与数据库条目匹配的“alex|ppp”。 先调用下面的方法

private void rememberedLogIn(){
    String filename = "UserInfo.txt";
    String info = "";
    String user = "";
    String pass = "";

    try{
        FileInputStream fIn = openFileInput(filename);
        BufferedReader r = new BufferedReader(new InputStreamReader(fIn));
        info = r.readLine();

    }catch(IOException e){
        e.printStackTrace(System.err);
    }

        for(int i =0; i < info.length();i++){
            if(info.charAt(i) == '|' ){
                user = info.substring(0,i);
                pass = info.substring(i+1);
                GlobalVar.loggedIn= true;
                break;
            }
        }
        new InitialStuff().execute(user,pass);
}

我已经仔细检查了 user 和 pass 的值,它们是预期的“alex”和“ppp”。接下来调用 InitialStuff,这是相关代码:

public class InitialStuff extends AsyncTask<String, Void, Toon>{
    int prog = 0;
    @Override
    protected Toon doInBackground(String... params) {
        android.os.Debug.waitForDebugger();
        Toon toon = null;
        Database db = new Database();
        db.establishConnection();
        if(db.tryLogIn(params[0], params[1])){
            prog = 2;
            publishProgress();
            toon = db.getToonFromDB(params[0]);
            prog = 4;
        }else prog = 3;
        publishProgress();
        return toon;
    }}

问题发生在我调用 db.tryLogin() 时,看起来像这样

public boolean tryLogIn(String toonName, String toonPass){
    try{
        while(!connected) establishConnection();
        String sqlQuery = "SELECT Password FROM Toons WHERE Name LIKE '" + toonName+"';";
        Statement stmt = con.createStatement();
        ResultSet rSet = stmt.executeQuery(sqlQuery);
        if(rSet.next()){
            String dbPass = rSet.getString(1).trim();
            if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE
                return true;
        }
    }
    catch(Exception e){ }
    return false;
}

我已经检查过 dbPass 从数据库返回为与 toonPass 匹配的“ppp”,但它将跳过返回 true 并返回 false。

如果有帮助,这是 eclipse 给我的关于这两者的信息

toonPass "ppp"(id=830041185816) 数 3
哈希码 0
偏移量 5
值 (id=830041185744)
[0]一个
[1] l
[2] 电子
[3] x
[4] |
[5] p
[6] p
[7]p

dbPass "ppp"(id=830041708816) 数 3
哈希码 0
偏移量 0
值 (id=830041709136)
[0] p
[1] p
[2]

请注意,我还尝试将“ppp”传递给 tryLogin() 方法而不将其作为子字符串,以防与问题有关并且结果相同。

编辑:我解决了这个问题......有点。我刚刚停止使用 .equals() 方法,而是使用 for 循环比较每个字符串中的字符

最佳答案

一个提示! 如果你正在玩 String 类方法,例如。 .compare() .equals() 等。记住字符集编码!尤其要确保与 IDE、项目文件、资源和数据库的编码相匹配(当您从外部源以字符串形式加载/读取数据时)

关于Java .equals() 在字符串相等时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027904/

相关文章:

java - 如何在Nifi中用表达式语言定义ControllerService

java - 无法从 java : java. io.IOException : . 运行 ksh 脚本:未找到

java - 带有加号字符的字符串匹配方法返回 false

c++ - 为什么 msgpack-c++ 在我的例子中不支持 vector<float> 或 vector<double>?

javascript - IE7 Javascript 和使用字符串作为数组

java - 如何使用 hibernate 和 spring @transactional 释放 blob?

android - Jetpack 撰写 : Textfield and FAB not using full width

Light 主题中的 Android TabWidget

javascript - 如何在javascript中检测Dolphin浏览器?

java - 有限次数地随机替换字符串中的某个单词 | java