Переменная действует по-разному в зависимости от положения точки останова - PullRequest
0 голосов
/ 26 декабря 2011

Это действительно странная проблема, и я не могу понять, в чем дело.

У меня есть два строковых массива, объявленных в верхней части класса:

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 является нулевым! Такого не должно быть. (Кстати, я тестирую массив test визуально со списком.)

Если я продолжу и установлю точку останова в точке B и отладю приложение, приложение останавливается (прерывается) здесь. Это, конечно, ожидается, поскольку он утверждает, что artistsOnlyArray равен нулю.

Если вместо этого поместить точку останова в точку C, точка останова не будет достигнута. Также «хорошо».

Если я установлю точку останова в точке А, все изменится. Конечно, точка останова достигнута, и теперь он должен проверить, является ли массив нулевым. Я нажимаю F8 для возобновления (я использую Eclipse), и внезапно test[0] означает «не пусто!» . Я также вижу, что artistsOnlyArray является правильным (не нулевым).

Почему появление (и положение) точки останова вызывает такое поведение?

Ответы [ 2 ]

1 голос
/ 26 декабря 2011

Я могу только предположить, что это из-за «дополнительного времени», которое рабочий поток имеет, когда вы устанавливаете точку останова в точке A.

Когда вы не размещаете точку останова, выполнение оператора if происходит до того, как любой рабочий поток заполняет массив, и поэтому он входит в if.

С другой стороны, когда вы помещаете точку останова в точку A, вы даете рабочему потоку время на заполнение массива. Таким образом, к тому времени, как вы продолжите, массив уже заполнен и входит в else.

0 голосов
/ 26 декабря 2011

Вы сами ответили: " Они оба обновлены в отдельной теме ".

Точка останова, возможно, вызывает состояние "гонки", когда вмешиваются относительные временные характеристики потоков.В частности, поток обновления может блокироваться или не блокироваться до наступления точки останова.

...