Программа работает при переходе, но не работает

Я пишу программу, которая отображает информацию о рейсе, как показано ниже:

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, ****** 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();
 }
 }
}
</string,></entry<string,airport></string,></flight></flight></flight></flight></airport></flight>

Проблема заключается в использовании метода:

printItinerary(Airport airportA, Airport airportB, int leg, ****** 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: Я добавил несколько выходов в поток ошибок, и вот результат, когда я запускаю его... по какой-то причине он останавливается в методе hasAPath:

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 для следующего рейса, который будет Бостон и Торонто, который затем будет проверять все полевые рейсы в Бостон, чтобы узнать, связаны ли их аэропорты с торонто... и так далее

1 ответ

Проблема решена. Ответ заключался в том, что при запуске отладки он запускается, несмотря на все возможности, даже если вы возвращаете ответ, поэтому он оценивается как true и работает, я изменил метод пути из этого:

private boolean hasAPath(Airport airportA, Airport airportB) {
 Iterator<flight> aFlights = airportA.getOutgoingFlights();
 while(aFlights.hasNext()) {
 Flight currentFlight = aFlights.next();
 if(currentFlight.getAirportB().equals(airportB)) { 
 return true; 
 }else { 
 return hasAPath(currentFlight.getAirportB(), airportB);
 }
 }
 return false;
}
</flight>

Для этого:

private boolean hasAPath(Airport airportA, Airport airportB) {
 Iterator<flight> aFlights = airportA.getOutgoingFlights();
 while(aFlights.hasNext()) {
 Flight currentFlight = aFlights.next();
 if(currentFlight.getAirportB().equals(airportB)) { 
 return true; 
 }else {
 if(hasAPath(currentFlight.getAirportB(), airportB)) {
 return true;
 }else {
 continue;
 }
 }
 }
 return false;
} 
</flight>

Если кто-то еще ищет эту проблему, я предлагаю разместить выходы на консоль на каждом блоке вашего кода и следить за тем, что происходит, модель исполнения в режиме отладки должна отличаться от обычной при работе.

licensed under cc by-sa 3.0 with attribution.