空指针警告 - BatteryManager.EXTRA_LEVEL

Null Pointer Warning - 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;
    }

该代码似乎有效并且从未让我失望,但我收到警告

Method invocation 'batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)' may produce 'java.lang.NullPointerException'

这可能永远不会真正影响我的应用程序,但由于最终产品依赖于它,我想知道,我该如何解决这个潜在问题? 有没有办法把上面的重新组织起来达到同样的效果(获取电池当前的充电状态)?

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

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

registerReceiver 的 Javadoc 指出:

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

因此 有可能 return 你将成为一个空事件。您已经处理了值无效 ((level == -1 || scale == -1)) 的情况,因此我建议您只检查意图是否为空,并尽早 return 该值:

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