Java String.equals()方法不返回true或false

时间:2014-03-26 18:13:45

标签: java android

我在Android上运行以下代码,比较两个字符串并返回对象字段,如果其variable等于id

值永远不会是null,有一种情况我有id = "m1"var = "m1"。 (getFields()从MongoDB数据库中检索字段。)

通过在调试模式下观察表达式var.equal(id),我看到它返回true,但它不会进入下面if中的任何一个(它确实进入循环) 。)这里发生了什么?

public Field getField(String id) {
    for (Field field : getFields()) {
        String var = field.getProperties().getVariable();

        // I know I'm not supposed to do like this.
        // This is just for debug purposes.
        if (!var.equals(id)) {
            // Doesn't get into here
            Log.d("Different?", "Yes.");
        }

        if (var.equals(id)) {
            // Doesn't get into here either
            return field;
        }
    }
    return null;
}

2 个答案:

答案 0 :(得分:0)

tldr;诊断不正确,应重新评估。调试器报告误导性信息(甚至引入副作用)并不是闻所未闻,但实际的Dalvik运行时/类具有明确定义的行为。

对于任何给定的字符串(其中null不是字符串),由x和y表示,x.equals(y) == y.equals(x)并且输出基于deterministic的情况总是如此两个输入字符串 1

虽然更好使用if / else,但是通过equals的确定性(以及在提供的代码中使用if),以下语义等价性成立:

if (x.equals(y)) { a; }
else { b; }
// -- and --
if (x.equals(y)) { a; }
if (!x.equals(y)) { b; }

也就是说,{em> {a,b}中只有一个必须执行 - iff 该代码完全运行并且不会抛出任何异常。


1 唯一不同的方法是在调用之间重新分配变量;因为它们都是局部变量,所以没有潜在的线程问题。因为字符串是immutable,所以如果提供相同的字符串对象,也可以保证无法更改String.equals函数的结果。

  

String.equals将此字符串与指定的对象进行比较。当且仅当参数..表示与此对象相同的字符序列时,结果才为真。

答案 1 :(得分:0)

您的方法更好地写为:

public Field getField(final String id) throws IllegalArgumentException {
    for (Field field : getFields()) {
        String var = field.getProperties().getVariable();

        if (var.equals(id)) {
            // match found
            return field;
        } else {
            // no match
            Log.d("Different?", "Yes.");
        }
    }
    throw new IllegalArgumentException("No match for " + id + " found!");
}

看起来可能id并未真正包含在getFields()返回中,和/或它与您预期的情况不同。

你可以尝试:

if (var.equalsIgnoreCase(id))

这将检查大写和小写的值。

如果你正在返回null(来自你原来的方法)或者从重写中捕捉IllegalArgumentException,那么这意味着没有找到匹配,即。您的id并未真正包含在getFields()的回复中。

对于调试,您可以打印所有返回的字段:

for (Field field : getFields()) {
    System.out.println(field.getProperties().getVariable());
    // do your stuff

}

另一个调试选项:

public Field getField(final String id) throws IllegalArgumentException {

    Field[] fields = getFields();
    System.out.println("How many fields? " + fields.length);

    for (Field field : getFields()) {
        String var = field.getProperties().getVariable();

        System.out.println("Variable var is: " + var);
        System.out.println("Variable id is: " + id);

        if (var.equals(id)) {
            // match found
            return field;
        } else {
            // no match
            Log.d("Different?", "Yes.");
        }
    }
    throw new IllegalArgumentException("No match for " + id + " found!");
}