Ссылка на нулевой объект в приложении Android - PullRequest
0 голосов
/ 06 октября 2018

Hy Guys

Поэтому я пытаюсь получить приведенную ниже часть кода для запуска приложения списка покупок, однако я получаю сообщение об ошибке, вызывающее сбой приложения.

Код:

public void setProduct(Context context, View shoppingListViewFragment, String userEmail, String userName, ListModel shoppingListModel, ItemModel productModel) {
    String listID = shoppingListModel.getListID();
    String listName = shoppingListModel.getListName();
    String itemID = productModel.getItemID();
    String itemName = productModel.getItemName();
    Boolean currentList = productModel.getCurrentList();
    productNameContainer.setText(itemName);

    FirebaseFirestore dbRef = FirebaseFirestore.getInstance();
    DocumentReference itemIdRef = dbRef.collection("products").document(listID)
            .collection("shoppingListProducts").document(itemID);

    itemView.setOnClickListener(view -> {
        Map<String, Object> map = new HashMap<>();
        if (currentList) {
            map.put("currentList", false);
        } else {
            map.put("currentList", true);
        }
        itemIdRef.update(map).addOnSuccessListener(aVoid -> {
            if (currentList) {
                dbRef.collection("shoppingLists").document(userEmail)
                        .collection("userShoppingLists").document(listID).get().addOnCompleteListener(task -> {
                            Map<String, Object> map1 = (Map<String, Object>) task.getResult().get("users");
                            String notificationMessage = userName + " has just bought " + itemName + " from " + listName + "'s list!";
                            UserNotificationsModel userNotificationsModel = new UserNotificationsModel(notificationMessage, userEmail);

                            for (Map.Entry<String, Object> entry : map1.entrySet()) {
                                String sharedUserEmail = entry.getKey();

                                if (!sharedUserEmail.equals(userEmail)) {
                                    dbRef.collection("notifications").document(sharedUserEmail)
                                            .collection("userNotifications").document()
                                            .set(userNotificationsModel);
                                }
                            }
                        });
            }
        });
    });

    itemView.setOnLongClickListener(view -> {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Edit / Delete Item");

        EditText editText = new EditText(context);
        editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
        editText.setText(itemName);
        editText.setSelection(editText.getText().length());
        editText.setHint("Please type item name");
        editText.setHintTextColor(Color.GRAY);
        builder.setView(editText);

        builder.setPositiveButton("Update", (dialogInterface, i) -> {
            String newItemName = editText.getText().toString().trim();
            Map<String, Object> map = new HashMap<>();
            map.put("itemName", newItemName);
            itemIdRef.update(map);
        });

        builder.setNegativeButton("Delete", (dialogInterface, i) -> {
            itemIdRef.delete().addOnSuccessListener(aVoid -> Snackbar.make(shoppingListViewFragment, "Item deleted!", Snackbar.LENGTH_LONG).show());
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();

        return true;
    });
}

При запуске приложения в строке 61 возникает фатальная ошибка, которая находится в цикле for "for (запись Map.Entry: map1.entrySet ())"

Я получаю приведенную ниже ошибку от Android Studio IDE

E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: example.com.shoppinghelper, PID: 17150 java.lang.NullPointerException:Попытка вызвать метод интерфейса 'java.util.Set java.util.Map.entrySet ()' для ссылки на пустой объект по адресу example.com.shoppinghelper.shopping_container.ProductContainer.lambda $ null $ 0 $ ProductContainer (ProductContainer.java:61)at example.com.shoppinghelper.shopping_container.ProductContainer $$ Lambda $ 6.onComplete (неизвестный источник: 0) на com.google.android.gms.tasks.zzf.run (неизвестный источник: 23) на android.os.Handler.handleCallback(Handler.java:789) на android.os.Handler.dispatchMessage (Handler.java:98) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6940) на java.lang.reflect.Metod.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

По сути, код пытается передать данные в коллекцию уведомлений, если кто-то предоставил доступ к определенному списку.Однако, если нет никого, с кем я бы поделился определенным списком покупок, то я получаю вышеуказанную ошибку.

Видеоруководство, которому я следую: https://www.youtube.com/watch?v=6RzB4HXzQyA&list=PLn2n4GESV0AmXOWOam729bC47v0d0Ohee&index=16

Пожалуйста помоги.:)

1 Ответ

0 голосов
/ 06 октября 2018

Вашему объекту map1 присваивается значение getResult (), но вы обнаружите, что getResult () будет возвращать ноль

Map<String, Object> map1 = (Map<String, Object>) task.getResult().get("users");

Причиняет это для оператора

for (Map.Entry<String, Object> entry : map1.entrySet()){}

Чтобы вызвать исключение нулевого указателя, перед этим необходимо добавить проверку map1! = Null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...