【问题标题】:Java .equals() returning false when the strings are equal当字符串相等时,Java .equals() 返回 false
【发布时间】:2014-02-25 22:47:56
【问题描述】:

我正在制作一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我有与数据库条目匹配的“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 从数据库返回为“ppp”,它与 toonPass 匹配,但它会跳过返回 true 并改为返回 false。

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

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

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

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

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

【问题讨论】:

  • 无关,但是sql注入。
  • 这是我第一次在我的编程中处理外部数据库,我不得不自学,所以请原谅我缺乏知识......你是什么意思?
  • @user3293629 考虑如果toonName 是"foo' or '1' = '1" 会发生什么
  • 我很高兴你为什么在hashCode 和toonPass 和dbPass 中都得到0,因为我得到了111216。在不相关的注释上,给你一些提示:1)不要完成后忘记close() FileInputStream fIn 和BufferedReader r。 2) for-loop and if-block 用于查找管道“|”字符可以更改为indexOf("|")。 3)不要忘记在不使用时删除waitForDebugger()。 4) 如前所述,小心 SQL 注入。 5)如果当前不使用,不要忘记关闭与数据库的连接。

标签: java android string equals


【解决方案1】:

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

【讨论】:

  • equals String 和 Charsequence 总是返回 false。很好的提示:)
【解决方案2】:
if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE

你确定吗?

问题大概出在这里:

catch(Exception e){ }

改为编写此代码并检查您的日志:

catch(Exception e){ e.printStackTrace(); }

【讨论】:

  • 我添加了这一点,但正如我所料,它没有改变结果,没有抛出异常,它只是直接跳过 if 语句到“return false”
【解决方案3】:

奇怪的是,Eclipse 调试信息似乎不匹配。您为toonPass 打印的char[] 看起来像“alex|ppp”,而dbPass 看起来像“ppp”。 toonPass 的偏移量 5 使字符串看起来是相等的,因为它跳过了前 5 个字符(“alex|”),因此最多为“ppp”。

我建议重写从文本文件中拆分“alex|ppp”的循环。如果您只想将其拆分为“|”字符然后info.split("|") 可能会成功。

【讨论】:

  • 另外,虽然这不一定是问题,但我强烈建议你听从@ben75 的建议,避免写catch(Exception e){ }
  • 我认为这也可能是问题,但它不是(“请注意,我也尝试将“ppp”传递给 tryLogin() 方法,而不将其作为子字符串,以防万一与问题有关,结果是相同的。”)即使“ppp”作为新字符串传入,它也不起作用。
  • 我在您的问题末尾看到了这一点,但它没有解释我们在调试信息中使用 offset=5 看到的内容。我能想到的唯一另一件事是字符编码问题,但对于如此简单的字符,这不太可能。
  • 如果我在传入“ppp”时发布变量的信息会有帮助吗?
  • @ATG 使用substring() 时,结果字符串与原始字符串共享相同的字符数组以提高速度(it uses this constructor),但equals 无论如何都应该工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多