【问题标题】:Android: Database delete not working. Function call skipped in debuggerAndroid:数据库删除不起作用。在调试器中跳过函数调用
【发布时间】: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 中。

标签: java android debugging


【解决方案1】:

事实证明,这是因为 if 中的 return 语句。我了解到,你总是应该在一个函数中只有一个 return 语句。如此处所示,拥有其他人可能会导致问题。尽管没有进入if 块,但它正在执行第一次返回。

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多