2015-08-11 2 views
0

Я пытаюсь получить текущий уровень заряда батареи устройства следующее:Null Pointer Предупреждение - BatteryManager.EXTRA_LEVEL

Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
    Log.i(LOG_FILTER, "Battery level = " + (level*100)/scale); 
    // error check values 
    if (level == -1 || scale == -1) { 
     return -1; 
    } else { 
     return (level * 100)/scale; 
    } 

код, кажется, работает и никогда не подводил меня, но я получает предупреждение :

вызов метода 'batteryIntent.getIntExtra (BatteryManager.EXTRA_LEVEL, -1)' может произвести 'java.lang.NullPointerException'

Это может никогда не повлиять на мое приложение, но поскольку в зависимости от этого есть конечный продукт, мне интересно, как я могу приспособить эту потенциальную проблему? Есть ли способ реорганизовать вышеупомянутое для достижения того же результата (получение текущего состояния заряда батареи)?

ответ

3

Javadoc для registerReceiver состояний:

* @return The first sticky intent found that matches <var>filter</var>, 
*   or null if there are none. 

Так есть вероятность того, что это вернет вам пустое событие. Вы уже обрабатываем случай, когда значения являются недействительными ((level == -1 || scale == -1)), поэтому я рекомендую вам просто проверить, является ли нуль намерение, и вернуть это значение рано:

if (batteryIntent == null) { 
    return -1; 
} 
+1

@ advdev1234 Просто чтобы прояснить, если вы идете в этом маршрут, который вы хотите проверить 'batteryIntent == null', прежде чем пытаться что-то вроде' batteryIntent.getIntExtra (...) ', потому что именно там будет ваш NPE. – WOUNDEDStevenJones

+0

Я добавил проверку нулевого намерения перед запросом на дополнительные услуги, и предупреждение исчезло, спасибо за вашу помощь. @kcoppock Не могли бы вы сказать, что, поскольку намерение изменения состояния батареи часто срабатывает и является липким, единственный вероятный сценарий, который может вызвать нулевое намерение, заключается в том, что батарея как-то отсутствует? – advdev1234

+0

@ advdev1234 Я не мог сказать точно; в любой момент, когда метод утверждает, что в некоторых случаях он может возвращать значение null, лучше всего его обрабатывать. – kcoppock

0

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

try { 
    //your code here 
} catch (NullPointerException e) { 
    //handle the error here, maybe return -1? 
}