equal() 和 equalsIgnoreCase() 为相等字符串返回 false

2022-09-04 06:04:26

我在Mac上使用eclipse IDE(版本:3.4.2),并且遇到了以下问题。

当使用 equal() 或 equalsIgnoreCase() 方法比较字符串时,即使字符串相等,我也会收到 false。例如,下面的代码将以下条件视为 false,即使 value[0] = “debug_mode”

if (values[0].equalsIgnoreCase("debug_mode")) 
    debug_mode = true;

这是以下循环的一部分:

String value = dis.readLine();
String values[] = value.trim().split("=");
if (values.length >= 2)
{
    Config.prnt_dbg_msg(values[0] + "\t" + values[1]);
    if (values[0].equalsIgnoreCase("debug_mode")) 
        debug_mode = isTrue(values[1]);
    if (values[0].equalsIgnoreCase("debug_query_parsing")) 
        debug_query_parsing = isTrue(values[1]);
    if (values[0].equalsIgnoreCase("username")) 
        Connection_Manager.alterAccessParameters(values[1], null, null);
    if (values[0].equalsIgnoreCase("password")) 
        Connection_Manager.alterAccessParameters(null, values[1], null);
if (values[0].equalsIgnoreCase("database")) 
        Connection_Manager.alterAccessParameters(null, null, values[1]);
    if (values[0].equalsIgnoreCase("allow_duplicate_entries")) 
        allow_duplicate_entries = isTrue(values[1]);
}                         

我尝试使用并得到相同的结果。有人知道为什么吗?value[0].equal("debug_mode")


答案 1

这确实很奇怪,:)你可以把上面的代码改成这样吗:

if ("debug_mode".equalsIgnoreCase("debug_mode")) 
    debug_mode = true;

确认它工作正常,然后仔细检查为什么你的不是“debug_mode”。values[0]

以下是我现在想到的要检查的事项列表:

  • 检查values[0].length() == "debug_mode".length()
  • 我非常怀疑,但无论如何,让我把它放在桌子上 - 你有没有机会使用Unicode?
  • 是否可以打印每个字符,并在该字符和“debug_mode”字符串的相应字符之间执行操作?.equals()
  • 如果这是在一个更大的项目中,你能在一个简单的Java项目中做同样的事情并确认它在那里工作吗?

为了澄清,问题实际上是使用。来自 javadoc (http://download.oracle.com/javase/1.6.0/docs/api/java/io/DataInputStream.html):DataInputStream.readLine

readLine()
      Deprecated. This method does not properly convert bytes to characters. ...

它实际上以一种微妙的方式与Unicode有关 - 当你这样做时,你实际上为字母写了两个字节和,大端Unicode。writeChar097a

下面是一个显示行为的独立代码段:

import java.io.*;
import java.util.*;

public class B {
  public static void main(String[] args) throws Exception {
    String os = "abc";

    System.out.println("---- unicode, big-endian");
    for(byte b: os.getBytes("UTF-16BE")) {
      System.out.println(b);
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);

    for(char c: os.toCharArray()) {
      dos.writeChar(c);
    }

    byte[] ba = baos.toByteArray();

    System.out.println("---- ba");
    for(byte b: ba) {
      System.out.println(b);
    }

    ByteArrayInputStream bais = new ByteArrayInputStream(ba);
    DataInputStream dis = new DataInputStream(bais);

    System.out.println("---- dis");
    String s = dis.readLine();
    System.out.println(s);
    System.out.println("String length is " + s.length() 
      + ", but you would expect " + os.length() 
      + ", as that is what you see printed...");
  }
}

故事的寓意 - 不要使用已弃用的api...此外,空格是无声的杀手:http://www.codinghorror.com/blog/2009/11/whitespace-the-silent-killer.html


答案 2

我刚刚遇到了这个完全相同的问题,使用equalsIgnoreCase。

经过几个小时盯着屏幕,调试代码,我突然意识到我的if语句有一个;最后,

if ("stupid".equalsIgnoreCase.("STupid");
{
     //it always gets here 

}

希望这能帮助将来的人。