我是
JAVA
的新手。我认为我所有的代码都是正确的。我实际上并不知道我的代码有什么问题,但它显示错误。
错误:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "F28DA_CW2.FlightsReader.getAirports()" because "this.flightReader" is null
at F28DA_CW2.FlyingPlanner.leastCost(FlyingPlanner.java:206)
at F28DA_CW2.FlyingPlannerMainPartBC.main(FlyingPlannerMainPartBC.java:29)
下面是我正在处理的代码:
主文件
import java.io.FileNotFoundException;
public class FlyingPlannerMainPartBC {
public static void main(String[] args) throws FlyingPlannerException, FileNotFoundException {
FlyingPlanner fi;
fi = new FlyingPlanner();
try {
fi.populate(new FlightsReader());
// Implement here your user interface using the methods of Part B. You could
// optionally expand it to use the methods of Part C.
} catch (FileNotFoundException | FlyingPlannerException e) {
e.printStackTrace();
}
FlightsReader flightReader = new FlightsReader();
flightReader.getAirports();
flightReader.getFlights();
FlyingPlanner pr = new FlyingPlanner();
System.out.println(pr.leastCost("EDI", "DXB")); // line: 29
}
}
错误来源的片段。
@Override
public Journey leastCost(String from, String to) throws FlyingPlannerException {
// TODO Auto-generated method stub
HashSet<String[]> airports = flightReader.getAirports(); //line206
HashSet<String[]> flights = flightReader.getFlights();
DefaultDirectedWeightedGraph<String, DefaultWeightedEdge> leastCost = new DefaultDirectedWeightedGraph<>(
DefaultWeightedEdge.class);
for (String[] flight : flights) {
leastCost.addVertex(flight[1]);
leastCost.addVertex(flight[3]);
leastCost.addEdge(flight[1], flight[3]);
leastCost.setEdgeWeight(flight[1], flight[3], Integer.parseInt(flight[5]));
}
DijkstraShortestPath<String, DefaultWeightedEdge> dijkstraAlg = new DijkstraShortestPath<>(leastCost);
GraphPath<String, DefaultWeightedEdge> shortestPath = dijkstraAlg.getPath(from, to);
int totalCost = 0;
int totalHop = 0;
int totalTime = 0;
for (DefaultWeightedEdge defaultWeightedEdge : shortestPath.getEdgeList()) {
totalCost = totalCost + (int) leastCost.getEdgeWeight(defaultWeightedEdge);
totalHop = totalHop + 1;
String v1 = leastCost.getEdgeSource(defaultWeightedEdge);
String v2 = leastCost.getEdgeTarget(defaultWeightedEdge);
System.out.println(totalHop + ". " + v1 + "--->" + v2);
}
Journey journey = new Journey();
journey.setTotalCost(totalCost);
journey.setTotalHop(totalHop);
System.out.println(totalCost);
System.out.println(totalHop);
return journey;
}
最后读取文件的扫描仪文件(我认为完全没问题)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
public class FlightsReader {
private static final File flightsDatasetFolder = new File("FlightsDataset");
private static final File flightsDatasetFlights = new File(flightsDatasetFolder, "flights.csv");
private static final File flightsDatasetAirports = new File(flightsDatasetFolder, "airports.csv");
private HashSet<String[]> airports;
private HashSet<String[]> flights;
public FlightsReader() throws FileNotFoundException, FlyingPlannerException {
this.airports = new HashSet<String[]>();
this.flights = new HashSet<String[]>();
// Adding flights, and building list of needed airport
HashSet<String> airportsNeeded = new HashSet<String>();
Scanner flightsScanner = new Scanner(flightsDatasetFlights);
while (flightsScanner.hasNextLine()) {
String line = flightsScanner.nextLine();
String[] fields = line.split(",");
String from = fields[1];
String to = fields[3];
airportsNeeded.add(from);
airportsNeeded.add(to);
this.flights.add(fields);
}
flightsScanner.close();
// Adding airports
Scanner airportsScanner = new Scanner(flightsDatasetAirports);
while (airportsScanner.hasNextLine()) {
String line = airportsScanner.nextLine();
String[] fields = line.split(",");
if (airportsNeeded.contains(fields[0])) {
this.airports.add(fields);
}
}
airportsScanner.close();
}
/**
* Returns a hash set of airport details (0: airport code, 1: city, 2: airport
* name)
*/
public HashSet<String[]> getAirports() {
return this.airports;
}
/**
* Returns a hash set of flight details (0: flight code, 1: airport code of
* departure, 2: departure time GMT, 3: airport code of arrival, 4: arrival time
* GMT, 5: flight cost)
*/
public HashSet<String[]> getFlights() {
return this.flights;
}
}
我认为飞行阅读器代码效果很好。我不太确定问题出在哪里。
感谢任何能帮助我的 JAVA 大师。
我想你忘了在对象
flightReader
中初始化FlyingPlanner
。我猜你必须在调用 pr.setflightReader(flightReader)
之前先调用 pr.leastCost("EDI", "DXB")
之类的东西,或者必须有一个构造函数将 flightReader
作为输入。