变量根据断点的位置而不同地起作用

时间:2011-12-25 22:12:53

标签: android debugging breakpoints

这是一个非常奇怪的问题,我不能为我的生活弄清楚什么是错的。

我有两个字符串数组,在类的顶部声明:

String[] artistsURLIndexArray;
String[] artistsOnlyArray;

它们都在一个在onCreate方法中运行的单独线程(后台工作程序)中更新。我在调试中看到一切正常,数组已正确更新。

在后台线程之后,我有以下代码(仍在onCreate方法中):

String[] test;

if(artistsOnlyArray == null) // point A
{
    test = new String[] { "empty...", "asd" }; // point B
}
else
{           
    test = new String[] { "not empty!", "asd" }; // point C
}

现在,当我'运行'应用程序(没有调试)时,test[0]是“空的......”。也就是说,artistsOnlyArray为空!情况并非如此。 (顺便说一下,我用listview直观地测试test数组。)

如果我继续在B点放置断点并调试应用程序,应用程序会停止(中断)。当然,这是预期的,因为它声称artistsOnlyArray为空。

如果我在C点放置一个断点,则不会到达断点。也'好'。

但是,如果我在A点放置一个断点,那么一切都会改变。当然会到达断点,现在必须检查数组是否为空。我按F8继续(我正在使用Eclipse),突然,test[0] “不为空!”。我还可以看到artistsOnlyArray是正确的(非空)。

为什么断点的外观(和位置)会导致此行为?

2 个答案:

答案 0 :(得分:1)

我只能假设这是因为在A点放置断点时工作线程的“额外时间”。

当你没有放置任何断点时,if语句的执行在之前发生任何工作线程填充数组,因此它进入if

另一方面,当您在A点放置断点时,您可以为工作线程填充数组。因此,当您继续时,阵列已经填充并进入else

答案 1 :(得分:0)

你自己回答:“它们都在一个单独的线程中更新”。

断点可能导致“竞争”条件,其中线程的相对时间受到干扰。具体而言,在断点发生之前,可能会阻止或不阻止更新线程。