我已经编写了一个数据库管理器来处理我的Android应用程序中的查询,而我用来删除行的函数做了一些奇怪的事情。这是功能:
public synchronized boolean removeChannel(String channel_name) {
IMrekMessageDbAdapter messageAdapter = new IMrekMessageDbAdapter(this.context);
messageAdapter.open();
long id = getChannelId(channel_name);
if (!messageAdapter.clearChannel(id)) {
// return false if we can't clear the messages for the channel
// this likely means that the channel doesn't actually exist and something
// is messed up.
return false;
}
boolean ret = database.delete(DATABASE_TABLE, KEY_ID + " = ?", new String[]{((Long)id).toString()}) > 0;
return ret;
}
现在,使用这样的代码,它会命中if为什么评估为false,因此跳过它。但是它会跳过ret
的赋值并转到return语句(因此也会跳过database.delete()
调用。调试器也不会在范围中显示ret
。
另一个问题指出,由于Android编译器优化字节码的方式,有时它可能会跳过行,因为这是它真正追踪的而不是java。但是,如果我将return false;
内的database.delete()
注释掉,则不会跳过ret
调用/分配给return
。它确实删除了应该删除的行。
我的问题基本上是:为什么它会跳过函数的其余部分,因为if块中的{{1}}语句没有被执行?
答案 0 :(得分:0)
事实证明,这是因为if
内部的return语句。我了解到你总是应该在函数中有一个return语句。如此处所示,拥有其他人可能会导致问题。尽管没有进入if
区块,但它正在执行第一次返回。