【发布时间】:2011-10-31 20:40:32
【问题描述】:
我编写了一个数据库管理器来处理我的 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;
}
现在,使用这样的代码,它会遇到计算结果为 false 的 if,因此会跳过它。然而,它跳过了ret 的分配并直接进入了return 语句(因此也跳过了database.delete() 调用。调试器也不会在范围内显示ret。
另一个问题指出,有时它可能会因为 Android 编译器优化字节码的方式而跳过行,因为这是它真正追踪的内容,而不是 java.util.但是,如果我注释掉里面的return false;,如果它没有跳过database.delete() 对ret 的调用/分配。它实际上确实删除了它应该删除的行。
我的问题基本上是:为什么它会跳过函数的其余部分,因为 if 块中的 return 语句没有被执行?
【问题讨论】:
-
我建议你先做
Clean(Project->Clean) 项目,然后重新调试。我怀疑调试器“困惑”并显示错误的行。似乎if条件被评估为真并执行return false。 -
我不知道,我刷新并清理了几次项目,还重新启动了 eclipse、我的电脑等。正如我在文档中看到的那样,原始类型,如布尔值,总是初始化为 0 值,因此即使跳过函数调用,
ret也会被初始化为 false,这就是它返回的值。如果我进入它在 if 条件中调用的函数,我可以看到它正在返回一个真值,因此,正如它所做的那样,它应该跳过该块。 -
其他可能的解决方案是将
if更改为if-else并将最后两行放在else中。