空指针异常JAVA。当输入文件不为空时,为什么它为空?

问题描述 投票:0回答:1

我是

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 大师。

java jaas jgrapht
1个回答
0
投票

我想你忘了在对象

flightReader
中初始化
FlyingPlanner
。我猜你必须在调用
pr.setflightReader(flightReader)
之前先调用
pr.leastCost("EDI", "DXB")
之类的东西,或者必须有一个构造函数将
flightReader
作为输入。

© www.soinside.com 2019 - 2024. All rights reserved.