我正在努力学习如何在Android中使用AlarmManager,所以我是AlarmManager类的新手,但不是Java的新手。我使用的是Android Studio 3.1.3。使用AlarmManager.setExact((.时,我在编辑器中收到警告
代码:
AlarmManager alarmMgr = (AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("delayed");
PendingIntent alarmIntent = PendingIntent.getBroadcast(activity, 0, intent, PendingIntent.FLAG_ONE_SHOT);
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + (120 * 1000), alarmIntent);
我已经成功地运行了这个代码,从当前时间起触发了警报2秒。
警告在"setExact"部分突出显示,对我来说毫无意义,所以我想知道是否有人能为我解释一下。
警告/错误:
Method invocation 'seExact' may produce 'java.lang.NullPointerException'
我通常理解NullPointerException是什么,但我不知道我的代码中写的是什么,可能会出现特定的Exception?
getSystemService()
返回类型被注释为@Nullable
,尝试调用可为null的方法是潜在的NPE。
您可以通过抑制不关心潜在NPE的警告
//noinspection ConstantConditions
alarmMgr.setExact(...);
或者添加一个null检查以确保在运行时严格的非null性。在API 19+的Java中,我更喜欢Objects.requireNonNull()
。
该警告告诉您可能存在NullPointerException
。如果它不能将getSystemService
的返回值强制转换为AlarmManager
,或者如果它返回null,则alarmMgr
将从此行为null:
AlarmManager alarmMgr = (AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);
当您尝试在后面的行中使用它时,它将为null。为了避免警告,您可以在使用之前先检查null:
if( alarmMgr != null ) {
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + (120 * 1000), alarmIntent);
}