我在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;
}
答案 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!");
}