【问题标题】:AlarmManager.setExact() possible Error warning NullPointerExceptionAlarmManager.setExact() 可能 错误警告 NullPointerException
【发布时间】:2018-12-27 00:10:07
【问题描述】:

我正在尝试学习如何在 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 是什么,但我无法弄清楚我的代码中写的哪些内容可能导致该特定异常?

【问题讨论】:

    标签: android nullpointerexception warnings alarmmanager


    【解决方案1】:

    getSystemService() 返回类型被注解为@Nullable,并且尝试在可空对象上调用方法是潜在的 NPE。

    您可以抑制警告以不关心潜在的 NPE

    //noinspection ConstantConditions
    alarmMgr.setExact(...);
    

    或添加空检查以确保在运行时严格不为空。对于 API 19+ 的 Java,我更喜欢 Objects.requireNonNull()

    【讨论】:

      【解决方案2】:

      那个警告告诉你一个可能NullPointerException。如果它不能将getSystemService 的返回值转换为AlarmManager 或者如果它返回null,那么alarmMgr 将从该行中为null:

      AlarmManager alarmMgr = (AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);
      

      当您尝试在后面的行中使用它时,它将为空。为避免警告,您可以在使用前先检查 null:

      if( alarmMgr != null ) {
           alarmMgr.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + (120 * 1000), alarmIntent);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多