Причина, по которой указанный код вызывает исключение NullPointerException, заключается в том, что он пытается получить доступ к currentAdvertisingSet[0]
до того, как вы присвоили значение этому элементу массива.
Когда код инициализирует его с final AdvertisingSet[] currentAdvertisingSet = new AdvertisingSet[1];
, тогда содержимое массива инициализируется с каждым элементом, равным нулю. Код не инициализирует currentAdvertisingSet[0]
ненулевым значением, пока не выполнится AdvertisingSetCallback
. Это асинхронно, и произойдет через некоторое время после вызова advertiser.startAdvertisingSet(...)
.
Проблема заключается в том, что этот обратный вызов еще не произошел при выполнении следующей строки currentAdvertisingSet[0].setAdvertisingData(...)
несколько микросекунд спустя. Когда он выполняется, элемент currentAdvertisingSet[0]
еще не был инициализирован - он все еще равен нулю. Вот почему происходит сбой кода.
Чтобы это исправить, необходимо дождаться использования currentAdvertisingSet[0]
, пока он не будет инициализирован. Конечно, вы можете добавить проверку типа if (currentAdvertisingSet[0] != null)
, чтобы предотвратить взлом sh, но в показанном коде это никогда не будет верным, поэтому код никогда не будет выполнен.
В конечном итоге вам необходимо переместить код, который изменяет рекламный набор, чтобы он выполнялся позднее. Вы можете поместить этот код в обратный вызов, но это может не иметь смысла для вашего варианта использования - скорее всего, нет смысла начинать рекламу, а затем немедленно менять ее на что-то другое.