当前位置: 首页 > 知识库问答 >
问题:

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

孟跃
2023-03-14

我正在制作一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我有与数据库条目匹配的“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”,这是预期的。下一个初始文件被调用,这是相关代码:

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。

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

toonPass “ppp” (id=830041185816) 计数 3
哈希代码 0
偏移量 5
值 (id=830041185744) [0]
a [1]
l [2]
e [3]
x
[4] |
[5] 页码 [6] 页

[7] 页码

db pass " PPP "(id = 830041708816)count 3 < br > hashCode 0 < br > offset 0 < br > value(id = 830041709136)< br >[0]p < br >[1]p < br >[2]p

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

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

共有3个答案

雷逸仙
2023-03-14

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

我建议重写从文本文件中拆分“alex|ppp”的循环。如果您只想在“|”字符上拆分它,那么info.split ("|")可能会奏效。

商泽宇
2023-03-14
if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE

你真的确定吗?

问题大概就在这里:

catch(Exception e){ }

改为写这篇文章并检查日志:

catch(Exception e){ e.printStackTrace(); }
湛博易
2023-03-14

一个提示!如果您正在使用String类方法,例如.compare().equals()等,请记住字符集编码!特别是确保与IDE、项目文件、资源匹配

 类似资料:
  • 问题内容: 我正在Mac上使用Eclipse IDE(版本:3.4.2),但遇到了以下问题。 使用equal()或equalsIgnoreCase()方法在字符串之间进行比较时,即使字符串相等,我也会收到false。例如,即使values [0] =“ debug_mode”,以下代码也将以下条件视为false: 这是以下循环的一部分: 我尝试使用并获得了相同的结果。有人知道为什么吗? 问题答案:

  • 当我使用户名为公共时为什么会出错:

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 问题内容: 我有一个返回字符串的Java实例方法,我正在C ++中通过JNI调用此方法。我写了以下代码: 如何获取字符串并将其转换为const char *? 我的程序在访问冲突为0x00000000的最后一行崩溃。returnString不是NULL。 问题答案: 根据,最后一个参数是的指针。 更改 至 或者更好的是,返回一个 我建立了一个类似的简单示例,到目前为止,代码看起来还不错。 虽然,有

  • 问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f

  • 我有一个Java实例方法,它返回一个字符串,我通过C中的JNI调用这个方法。我编写了以下代码: 如何获取字符串并将其转换为常量字符*? 我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。