【问题标题】:Android: code acts crazyAndroid:代码行为疯狂
【发布时间】:2011-07-18 20:34:48
【问题描述】:

我有一个非常奇怪的问题,同时尝试在 Eclipse 上为 android 开发

我的程序总是返回无意义的语句,所以我尝试调试它。

现在我明白问题是什么了...... ...代码的行为简直是疯狂 - 这绝对不合逻辑

这是我的代码:

ArrayList<String[]> formatedVerses = readAndSplitDatabaseFile(database, books);

if (formatedVerses.size() < 1) { // check if readAndSplitDatabaseFile worked
    createDatabase(database, false); // if not. the database wasnt initialized
    formatedVerses = readAndSplitDatabaseFile(database, books); // try again 
}

return formatedVerses;

基本上我创建了这个 ArrayList

但是当我调试的时候,它不只是从上到下遍历代码,它会产生奇怪的不合逻辑的跳转

调试器到达行:

ArrayList<String[]> formatedVerses = readAndSplitDatabaseFile(database, books);

然后跳转到 if 语句(到目前为止一切顺利)

if (formatedVerses.size() < 1) {

但是 "formatedVerses.size()

但调试器不仅跳转到 if 块,而且实际上跳转到块的第二行:

formatedVerses = readAndSplitDatabaseFile(database, books);

这毫无意义。

我觉得有人在跟我开玩笑。

我就是想不通这个.....

我也尝试过重构代码... 但它只会变得更奇怪。

我也尝试过其他实现。比如这样:

if (formatedVerses.size() < 1) {
return array1;
} else{
doSomethingElse();
return array2;
}

在这种情况下,它会跳转到 if 块的真语句

 return array1;

然后,当我单击下一步时,它实际上从该行跳转到 return array2 位于 else-block 内,而完全省略了 doSomethingElse()-line

有人有什么想法吗? 因为我现在快疯了……

【问题讨论】:

  • 除了您遇到的问题;如果不是在第一次运行中,为什么数据库会在一个微秒后被初始化?你会使用一段时间,但 - 甚至更好 - 更好的设计模式

标签: android eclipse debugging


【解决方案1】:

通常当我看到这样的行为时,这是因为我没有运行我认为我正在运行的代码。我没有做过Android开发,所以我不能具体说,但是你有没有选中项目菜单下的“自动构建”?我发现可以大大减少我看到这种行为的次数。

您是否尝试过清理代码并进行完整的重建?您是在 Eclipse 之外还是在远程设备上运行它?如果在远程设备上,您是否已将代码发布到设备上?

正如我所说,我没有做过任何 Android 开发,所以从 Andriod 开发的角​​度来看,其中一些问题似乎很明显。

希望这些想法有所帮助。

【讨论】:

  • 1. “自动构建”已打开,我将其关闭 - 仍然没有变化。我清理了项目 - 仍然没有变化。我说'建立所有' - 没有改变。再次打开“自动构建” - 没有变化。 2.如何进行完整的重建?和 3. 我试过在 android-emulator 和真实设备上运行代码,所以我猜设备不是问题
  • 啊好吧 - 我只是想通过我一直经历的标准操作程序。听起来这可能是您正在体验的 Android 环境特有的东西,鉴于我缺乏经验,此时我必须离开。
  • 是的,再读一遍之后——我仍然觉得你没有执行你认为的代码。我不知道这是怎么发生的,但您的环境中似乎有些东西保留了旧代码。
  • 没问题。我实际上确实相信它与 eclipse 本身有关.....无论如何,还是感谢您的帮助
【解决方案2】:

对我来说,实际上听起来你的牙套在某种程度上错位了。它似乎忽略了 if 语句周围的大括号,像这样对待它。

if (formatedVerses.size() < 1) // check if readAndSplitDatabaseFile worked
    createDatabase(database, false); // if not. the database wasnt initialized
formatedVerses = readAndSplitDatabaseFile(database, books); // try again 

并没有真正解释你的第二个例子。

编辑:或者也许你的第二个块也奇怪地解析..虽然没有解释为什么代码在 return 语句之后继续。

if (formatedVerses.size() < 1) 
    return array1;
else
    doSomethingElse();
return array2;

【讨论】:

  • 我真的不这么认为。我刚刚删除了这个特定的代码块并重新编写了它。无论如何,我不能放错括号,因为我自己从不输入括号。我总是使用 STRG+SPACE 来自动完成所有内容;)
【解决方案3】:

只是为了详细说明 aperkins 所说的,这是正确的,Eclipse 调试器使用您的代码编译成 .class 文件时的行号信息,并使用您的源 .java 文件显示正在执行的代码行跑步。所以说你写这个:

if (readAndSplitDatabaseFile(database, books).size() < 1) { 
    createDatabase(database, false); // if not. the database wasnt initialized
    formatedVerses = readAndSplitDatabaseFile(database, books); // try again 
}

return formatedVerses;

然后构建并运行,然后添加一行代码和一个空行:

ArrayList<String[]> formatedVerses = readAndSplitDatabaseFile(database, books);

if (formatedVerses.size() < 1) { // check if readAndSplitDatabaseFile worked
    createDatabase(database, false); // if not. the database wasnt initialized
    formatedVerses = readAndSplitDatabaseFile(database, books); // try again 
}

return formatedVerses;

现在,当您进行调试时,您正在逐步执行第一个示例,但正在查看第二个示例。 aperkins 提到的解决方案只是重新构建并运行,或者撤消您的更改,直到它们与您上次编译时的内容相匹配。

【讨论】:

  • 我不这么认为。我只是在 if 块内写了 println - 在第一条和第二条语句之间。但调试器现在跳转到第三条语句。如果他按行号走,他不应该跳到 syso 吗?
【解决方案4】:

好的,我想通了。

奇怪的是,它是完全不同的东西。

我在程序的另一端犯了一些错误。它与这个代码段无关(问题甚至不在同一个类中。)

修复后,它又开始正常工作了。

我不明白,在这一点上,我不想理解它。

谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2010-12-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多