java.lang.NullPointerException: попытка вызвать метод интерфейса "java.util.Iterator java.lang.Iterable.iterator()" при запуске уведомления

Я заметил, что некоторые из моих пользователей получают это исключение. Я не знаю, как воспроизвести его, у меня есть только отчеты о Crashlytics. Кажется, это глубоко внутри кода Google. Из тысяч, которые использовали этот код, только 39 имели исключение.

Любая идея, что может быть неправильным?

Fatal Exception: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.lang.Iterable.iterator()' on a null object reference
       at android.app.ApplicationPackageManager.getUserIfProfile(ApplicationPackageManager.java:2141)
       at android.app.ApplicationPackageManager.getUserBadgeForDensity(ApplicationPackageManager.java:997)
       at android.app.Notification$Builder.getProfileBadgeDrawable(Notification.java:2877)
       at android.app.Notification$Builder.hasThreeLines(Notification.java:3092)
       at android.app.Notification$Builder.build(Notification.java:3646)
       at android.support.v4.app.NotificationCompatApi21$Builder.build(NotificationCompatApi21.java:136)
       at android.support.v7.app.NotificationCompat$LollipopExtender.build(NotificationCompat.java:504)
       at android.support.v4.app.NotificationCompat$NotificationCompatImplApi21.build(NotificationCompat.java:835)
       at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1752)
       at mycode.startNotification(mycode.java:361)

Благодарю.

Ответы

Ответ 1

ApplicationPackageManager.java
private UserInfo getUserIfProfile(int userHandle) {
    List<UserInfo> userProfiles = getUserManager().getProfiles(UserHandle.myUserId());
    for (UserInfo user : userProfiles) {
        if (user.id == userHandle) {
            return user;
        }
    }
    return null;
}

а также

public List<UserInfo> getProfiles(int userHandle) {
    try {
        return mService.getProfiles(userHandle, false /* enabledOnly */);
    } catch (RemoteException re) {
        Log.w(TAG, "Could not get user list", re);
        return null;
    }
}

Итак, если что-то не так с запросом AIDL или отключен профиль пользователя, у вас будет NPE в коде ApplicationPackageManager.java. Я думаю, что невозможно предотвратить эту ситуацию, и я советую вам создать создание уведомлений в try {} catch block