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.

そのため、null イベントが返される可能性があります値が無効な場合 ( (level == -1 || scale == -1)) は既に処理されているため、インテントが null であるかどうかを確認し、その値を早期に返すことをお勧めします。

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 に答える