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

时间:2014-02-25 22:47:57

标签: java android string equals

我正在创建一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中我有" alex | ppp&#34 ;它匹配数据库条目。 首先调用以下方法

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);
}

我已经仔细检查了用户和传递的值,他们是&#34; alex&#34;和&#34; ppp&#34;这是预料之中的。下一个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从数据库返回&#34; ppp&#34;它匹配toonPass但它会跳过返回true并返回false。

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

toonPass&#34; ppp&#34; (ID = 830041185816)     数3
    hashCode 0
    抵消5
    价值(id = 830041185744)
        [0] a         [1] l
        [2] e
        [3] x
        [4] |
        [5] p
        [6] p
        [7] p

dbPass&#34; ppp&#34; (ID = 830041708816)     数3
    hashCode 0
    偏移0
    价值(id = 830041709136)
        [0] p
        [1] p
        [2] p

请注意我也试过传递&#34; ppp&#34;到tryLogin()方法而不将其作为子字符串,以防与问题有关,结果是相同的。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE

你真的确定吗?

问题可能在这里:

catch(Exception e){ }

改为编写并检查日志:

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

答案 2 :(得分:0)

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

我建议重写从文本文件中拆分“alex | ppp”的循环。如果你只想把它拆分为'|'然后角色info.split("|")可能会成功。