程序在单步执行时有效,但在运行时没有

时间:2015-11-22 22:28:05

标签: java

我正在编写一个显示航班信息的程序,如下所示:

package d.airlineData.engine;

import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;

import a.airlineData.exceptions.NoFlightsException;
import c.airlineData.exceptions.NoAirportException;
import d.airlineData.graph.Airport;
import d.airlineData.graph.Flight;
import d.airlineData.graph.FlightGraph;

public class FlightGrapher {

    private FlightGraph fg;

    public FlightGrapher() throws NoFlightsException {      
        throw new NoFlightsException();
    }

    public FlightGrapher(ArrayList<Flight> flights) throws NoFlightsException  {
        fg = new FlightGraph();

        for(Flight flight: flights) {
            fg.addAirport(flight.getAirportA());
            fg.addAirport(flight.getAirportB());

            try {
                fg.addFlight(flight);
            } catch (NoAirportException e) {
                System.err.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }

    public void printAll() {
        HashSet<Airport> airports = fg.getAirports();

        for(Airport airport : airports) {
            System.out.println(airport + ":");
            try {
                Iterator<Flight> it = fg.getFlightsFor(airport);
                while(it.hasNext()) {
                    System.out.println("\t" + it.next());
                    System.out.println();
                }

            } catch (NoAirportException e) {
                System.err.println(e.getMessage() + " while attempting to get flights for " + airport);
                e.printStackTrace();
            }
        }

    }
        public void printItinerary(Airport airportA, Airport airportB) {
    System.out.println("Leg\tLeave\t\tAt\tOn\tArrive\tAt");
    printItinerary(airportA,airportB, 1, 0.0, Duration.ofHours(0));
}

private void printItinerary(Airport airportA, Airport airportB, int leg, double totalPrice, Duration totalDuration) {
    Iterator<Flight> aFlights = airportA.getOutgoingFlights();
    System.err.println("Enters method printItinerary");
    System.err.println("airportA "  + airportA);
    System.err.println("airportB "  + airportB);
    System.err.println("leg " + leg);
    System.err.println("total price " + totalPrice);
    System.err.println("Duration " + totalDuration.toMinutes() + "mins");
    System.err.println();
    while(aFlights.hasNext()) {

        Flight currentFlight = aFlights.next();
        System.err.println("Enters while of printItinerary currentFlight: ");
        System.err.println(currentFlight);
        if(currentFlight.getAirportB().equals(airportB)) {

            System.out.println(leg + "\t" +
                    currentFlight.getAirportA() + "\t" +
                    currentFlight.getDepartureTime() + "\t" +
                    currentFlight.getFlightNumber() + "\t" +
                    currentFlight.getAirportB() + "\t" +
                    currentFlight.getArrivalTime());

            System.out.println();
            System.out.println("Total journey costs\t= £" + (currentFlight.getPrice() + totalPrice));
            System.out.println("Total time in air\t= " + (currentFlight.getFlightDuration().plus(totalDuration)));

            return;

        }else {
            System.err.println("enters else " + "currentFlight " + currentFlight.getAirportB() + " airport B " + airportB );
            System.err.println();
            if(hasAPath(currentFlight.getAirportB(), airportB)) {
                System.out.println(leg + "\t" +
                        currentFlight.getAirportA() + "\t" +
                        currentFlight.getDepartureTime() + "\t" +
                        currentFlight.getFlightNumber() + "\t" +
                        currentFlight.getAirportB() + "\t" +
                        currentFlight.getArrivalTime());

                printItinerary(currentFlight.getAirportB(), airportB, leg + 1, 
                        (currentFlight.getPrice() + totalPrice), 
                        (currentFlight.getFlightDuration().plus(totalDuration)));   
            }
        }
    }       
}

private boolean hasAPath(Airport airportA, Airport airportB) {
    System.err.println("Enters hasAPath with airportA " + airportA + " airportB " + airportB);
    Iterator<Flight> aFlights = airportA.getOutgoingFlights();
    while(aFlights.hasNext()) {
        Flight currentFlight = aFlights.next();
        System.err.println("Enters while of hasAPath currentFlight: ");
        System.err.println(currentFlight);
        if(currentFlight.getAirportB().equals(airportB)) {  
            System.err.println("returns true for airportA " + airportA + " airportB " + airportB );
            return true;            
        }else {
            System.err.println("Calls hasAPath with airportA " + currentFlight.getAirportB() + " airportB " + airportB);
            return hasAPath(currentFlight.getAirportB(), airportB);
        }

    }
    System.err.println("returns false for airportA " + airportA + " airportB " + airportB );
    return false;
}

    public static void main(String[] args) {
        ArrayList<Flight> flights = new ArrayList<>();
        HashMap<String, Airport> airports = new HashMap<>();

        airports.put("Edinburgh", new Airport("Edinburgh")); 
        airports.put("Heathrow", new Airport("Heathrow")); 
        airports.put("Amsterdam", new Airport("Amsterdam")); 
        airports.put("Boston", new Airport("Boston")); 
        airports.put("Montreal", new Airport("Montreal")); 
        airports.put("Chicago", new Airport("Chicago")); 
        airports.put("Toronto", new Airport("Toronto")); 
        airports.put("New Delhi", new Airport("New Delhi")); 
        airports.put("Shanghai", new Airport("Shanghai")); 
        airports.put("Hong Kong", new Airport("Hong Kong")); 

        flights.add(new Flight(airports.get("Edinburgh"),airports.get("Heathrow"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 110.0));

        flights.add(new Flight(airports.get("Heathrow"),airports.get("Amsterdam"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 100.0));

        flights.add(new Flight(airports.get("Heathrow"),airports.get("Boston"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 230.0));

        flights.add(new Flight(airports.get("Boston"),airports.get("Chicago"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 150.0));

        flights.add(new Flight(airports.get("Boston"),airports.get("Montreal"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 100.0));

        flights.add(new Flight(airports.get("Montreal"),airports.get("Toronto"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 90.0));

        flights.add(new Flight(airports.get("Edinburgh"),airports.get("Chicago"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 560.0));

        flights.add(new Flight(airports.get("New Delhi"),airports.get("Shanghai"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 430.0));

        flights.add(new Flight(airports.get("Shanghai"),airports.get("Hong Kong"),
                "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 230.0));


        Iterator<Entry<String,Airport>> airportIt = airports.entrySet().iterator();

        while(airportIt.hasNext()) {
            Entry<String, Airport> pair = airportIt.next();
            Airport airport = pair.getValue();
            for(Flight flight: flights) {
                if(flight.getAirportA().equals(airport)) {
                    airport.addOutgoingFlight(flight);
                }
            }
        }

        try {
            FlightGrapher fg = new FlightGrapher(flights);
            //fg.printAll();
            fg.printItinerary(airports.get("Edinburgh"), airports.get("Toronto")); // steps into this method
        } catch (NoFlightsException e) {
            System.err.println(e.getMessage() + " when trying to make a flight between a nonexistant airport");
            e.printStackTrace();
        }

    }

}

我遇到的问题是使用方法时:

printItinerary(Airport airportA, Airport airportB, int leg, double totalPrice, Duration totalDuration)

在正常运行时它不会因为某些原因而执行,但是当我使用调试器逐步执行程序时,一切都运行良好,我得到了一个有意义的输出(格式不是很好,但是我可以使用它),为什么会这样?

输出应如下所示:

Leg    Leave      At    On    Arrive    At
1      Edinburgh  10:30 BA345 Heathrow  11:30
2      Heathrow   14:00 BA657 Boston    15:30
3      Boston     18:00 AA652 Montreal  19:30
4      Montreal   22:00 AA216 Toronto   23:30

Total Journey Cost = £530
Total Time in the Air = 4 hrs 20 min

当我正常运行时,我得到了这个:

Leg    Leave      At    On    Arrive    At

这是当我步骤(或运行调试)时:

Leg     Leave           At      On      Arrive      At
1       Edinburgh       22:10   B7982   Heathrow          23:15
2       Heathrow        22:10   B7982   Boston      23:15
3       Boston  22:10   B7982   Montreal            23:15
4       Montreal        22:10   B7982   Toronto     23:15

Total journey costs = £530.0
Total time in air   = PT4H20M

踩踏部分是我想要输出的内容(我将在稍后处理格式化)

eddit:我在错误流上添加了一堆输出,这是我运行它时的输出...由于某种原因它停在&#34; hasAPath&#34;方法:

Leg Leave       At  On  Arrive  At
Enters method printItinerary
airportA Edinburgh
airportB Toronto
leg 1
total price 0.0
Duration 0mins

Enters while of printItinerary currentFlight: 
Flight between Edinburgh & Chicago:
        For: £560.0
        Flight Number: B7982
        Leaves at: 22:10
        Arrives at: 23:15
        Duration: 1hr 5min
enters else currentFlight Chicago airport B Toronto

Enters hasAPath with airportA Chicago airportB Toronto
returns false for airportA Chicago airportB Toronto
Enters while of printItinerary currentFlight: 
Flight between Edinburgh & Heathrow:
        For: £110.0
        Flight Number: B7982
        Leaves at: 22:10
        Arrives at: 23:15
        Duration: 1hr 5min
enters else currentFlight Heathrow airport B Toronto

Enters hasAPath with airportA Heathrow airportB Toronto
Enters while of hasAPath currentFlight: 
Flight between Heathrow & Amsterdam:
        For: £100.0
        Flight Number: B7982
        Leaves at: 22:10
        Arrives at: 23:15
        Duration: 1hr 5min
Calls hasAPath with airportA Amsterdam airportB Toronto
Enters hasAPath with airportA Amsterdam airportB Toronto
returns false for airportA Amsterdam airportB Toronto

此时它应该返回,然后检查hasAPath以便下一次航班,即波士顿和多伦多,然后检查所有Bostons外出航班,看看他们的机场是否与多伦多有关......等等< / p>

0 个答案:

没有答案