0

我正在尝试通过以下方式获取设备的当前电池电量:

    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'

这可能永远不会真正影响我的应用程序,但由于最终产品依赖于它,我想知道,我该如何解决这个潜在问题? 有没有办法对上述内容进行重组以达到相同的结果(获取电池的当前充电状态)?

4

2 回答 2

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;
}
于 2015-08-11T16:00:04.630 回答
0

我会在它周围抛出一个 try/catch,因为你知道它可能会抛出错误,然后你可以在它发生时适当地处理它。

try {
    //your code here
} catch (NullPointerException e) {
    //handle the error here, maybe return -1?
}
于 2015-08-11T15:56:41.773 回答