В три для каждого обшито с помощью Map.Entry> Когда я повторяюсь, почему у меня есть исключение во втором цикле for-each? - PullRequest
0 голосов
/ 25 октября 2019

В трех foreach, реализованных с использованием Map.Entry >>, когда я выполняю итерацию на второй карте, в приведенном ниже коде у меня есть исключение NullPointerException. Я не могу понять, в чем причина. Для репликации вам нужно в папке проекта создать папку «inputData», которая содержит файл «data.txt» с некоторыми значениями, как показано ниже (я просто приведу несколько примеров):

Apahida,15,199,2017-09-03
Apahida,15,249,2017-09-03
Apahida,15,299,2017-09-03
Floresti,7,100,2017-09-01
Floresti,7,250,2017-09-01
Turda,29,149,2017-09-01
Turda,29,199,2017-09-02

После этого, когда я запускаю свой метод main из класса MainApp (см. Ниже), у меня появляется «Исключение в потоке» main «java.lang.NullPointerException» в строке с кодом, указанным с комментарием ниже. Можете ли вы выяснить, где проблема и предложить мне решение, пожалуйста?

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

public class MainApp {

    public static void main(String[] args) {

        List<Package> dataPackage = new ArrayList<>();

        File file = new File("inputData/data.txt");
        List<String> listInputData = null;
        try {
            listInputData = Files.readAllLines(Paths.get(file.getPath()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String string : listInputData) {
            String[] split = string.split(",");

            Package aPackage = new Package(split[0], Double.parseDouble(split[1]), Double.parseDouble(split[2]), split[3]);
            dataPackage.add(aPackage);
        }

        Map<String, Map<Date, List<Package>>> packagesGroupedBasedOnTargetLocationAndDeliveryDate = new HashMap<>();
        for (Package aPackage : dataPackage) {
            String targetLocationOfPackage = aPackage.getTargetLocation();
            boolean targetLocationExistInMap = false;
            for (Map.Entry<String, Map<Date, List<Package>>> targetLocationInMap : packagesGroupedBasedOnTargetLocationAndDeliveryDate.entrySet()
            ) {

                if (targetLocationInMap.getKey().equals(targetLocationOfPackage)) {
                    targetLocationExistInMap = true;
                    Map<Date, List<Package>> packagesGroupedBasedOnDeliveryDate =
                            packagesGroupedBasedOnTargetLocationAndDeliveryDate.get(targetLocationOfPackage);
                    boolean deliveryDateExistInMap = false;
                    Date deliveryDateOfPackage = aPackage.getDeliveryDate();
                    for (Map.Entry<Date, List<Package>> deliveryDateInMap : packagesGroupedBasedOnDeliveryDate.entrySet()) {

                        if (deliveryDateInMap.getKey().equals(deliveryDateOfPackage)) {
                            deliveryDateExistInMap = true;
                            packagesGroupedBasedOnTargetLocationAndDeliveryDate
                                    .get(targetLocationOfPackage)
                                    .get(deliveryDateOfPackage)
                                    .add(aPackage);
                        }
                    }
                    if (!deliveryDateExistInMap) {
                        List<Package> newListOfPackageByDeliveryDate = new ArrayList<>();
                        newListOfPackageByDeliveryDate.add(aPackage);
                        packagesGroupedBasedOnTargetLocationAndDeliveryDate
                                .get(targetLocationOfPackage)
                                .put(deliveryDateOfPackage, newListOfPackageByDeliveryDate);
                    }
                    System.out.println();
                    System.out.println(packagesGroupedBasedOnTargetLocationAndDeliveryDate.toString());
                    System.out.println();
                }

            }

            if (!targetLocationExistInMap) {
                List<Package> newListOfPackageByDeliveryDate = new ArrayList<>();
                newListOfPackageByDeliveryDate.add(aPackage);
                Map<Date, List<Package>> newMapOfPackageByDeliveryDate = new HashMap<>();
                newMapOfPackageByDeliveryDate.put(aPackage.getDeliveryDate(), newListOfPackageByDeliveryDate);
                packagesGroupedBasedOnTargetLocationAndDeliveryDate
                        .put(targetLocationOfPackage, newMapOfPackageByDeliveryDate);
            }
        }

        for (Map.Entry<String, Map<Date, List<Package>>> targetLocationSTRING :
                packagesGroupedBasedOnTargetLocationAndDeliveryDate.entrySet()) {

            for (Map.Entry<Date, List<Package>> deliveryDateDATE :
                    packagesGroupedBasedOnTargetLocationAndDeliveryDate
                            .get(targetLocationSTRING).entrySet()) {         /// ***EXCEPTION APPEAR HERE, WHY?***

                for (Package aPackage :
                        packagesGroupedBasedOnTargetLocationAndDeliveryDate
                                .get(targetLocationSTRING).get(deliveryDateDATE)) {
                    System.out.println(aPackage.toString());

                }
            }
        }


    }

}

1 Ответ

1 голос
/ 25 октября 2019

В строке, отмеченной /// ***EXCEPTION APPEAR HERE, WHY?***, вы делаете packagesGroupedBasedOnTargetLocationAndDeliveryDate.get(), передавая Map.Entry<String, Map<Date, List<Package>>> в качестве ключа. Однако ключи типа packagesGroupedBasedOnTargetLocationAndDeliveryDate имеют тип String, поэтому мы можем с самого начала сказать, что ключ не найден, и поэтому get возвращает null. Затем вы пытаетесь вызвать entrySet() для этого null, что дает NullPointerException.

Проблема возникает из-за Map.get() принятия ключа неправильного типа. Причина этого историческая. Однако ваша IDE должна предупредить вас об этом.

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