【问题标题】:In a three for-each imbricated using Map.Entry<String, Map<Date, List<SomeObject>>> when I iterate why I have a Exception in the second for-each loop?在使用 Map.Entry<String, Map<Date, List<SomeObject>>> 的三个 for-each 中,当我迭代为什么我在第二个 for-each 循环中有一个异常?
【发布时间】:2019-10-25 12:23:22
【问题描述】:

在使用 Map.Entry>> 的三个 foreach 中,当我在第二个 Map 上迭代时,我在下面的代码中有一个 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

之后,当我从 MainApp 类(见下文)运行我的 main 方法时,我在行中有一个“线程“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());

                }
            }
        }


    }

}

【问题讨论】:

标签: java list date dictionary nullpointerexception


【解决方案1】:

在标记为/// ***EXCEPTION APPEAR HERE, WHY?*** 的行中,您正在执行packagesGroupedBasedOnTargetLocationAndDeliveryDate.get(),将Map.Entry&lt;String, Map&lt;Date, List&lt;Package&gt;&gt;&gt; 作为键传递。但是packagesGroupedBasedOnTargetLocationAndDeliveryDate 的键是String 类型的,所以我们可以从一开始就知道没有找到键,get 因此返回null。接下来,您尝试在此null 上调用entrySet(),它会给出NullPointerException

问题来自Map.get() 接受了错误类型的密钥。其原因是历史性的。但是,您的 IDE 应该警告您。

【讨论】:

  • 听起来不错。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多