在使用 Map.Entry<String、Map<Date、List 的三个 for-each 中<SomeObject>>>当我迭代为什么我在第二个 for-ea



在使用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());
}
}
}

}
}

在标记为/// ***EXCEPTION APPEAR HERE, WHY?***的行中,您正在执行packagesGroupedBasedOnTargetLocationAndDeliveryDate.get(),将Map.Entry<String, Map<Date, List<Package>>>作为关键字传递。然而,packagesGroupedBasedOnTargetLocationAndDeliveryDate的密钥是String类型的,因此我们可以从一开始就判断出没有找到密钥,因此get返回null。接下来,您尝试在此null上调用entrySet(),它会给出一个NullPointerException

问题来自于Map.get()接受了错误类型的密钥。这是历史性的。但是你的IDE应该警告你。

最新更新