Not particularly sure what's causing this IndexOutOfBoundsException to occur. The code works perfectly find if I hard code all of the addFlightPath() parameters, but as soon as I attempt to use a for loop to populate the flightPaths arrayList an IndexOutOfBoundsException is thrown. I'm probably missing something small but I'm not sure what it could be.
The exception is thrown on the call to flightPaths.add(path) within the addFlightPath method
public class DijkstrasController
{
private FlightDatabase flightDatabase;
private List<Vertex> nodes;
private List<Edge> flightPaths;
public DijkstrasController(FlightDatabase flightDatabase)
{
this.flightDatabase = flightDatabase;
populateDijkstrasGraph(flightDatabase);
}
public String[] runDijkstras(String sourceAirport, String destinationAirport)
{
//Removed for visibility
}
public void populateDijkstrasGraph(FlightDatabase fdb)
{
nodes = new ArrayList<Vertex>();
flightPaths = new ArrayList<Edge>();
for (int i = 0; i < (fdb.getDatabaseSize()); i++)
{
Vertex location = new Vertex("Node_" + i, nodeNumberToNodeLetter(i));
nodes.add(location);
//This block of code throws an IndexOutOfBounds error
AirJourney journey = fdb.getFlightDetails(i);
String pathId = "Path_" + journey.getOriginAirport() + journey.getDestinationAirport();
int sourceAirport = nodeLetterToNodeNumber(journey.getOriginAirport());
int destinationAirport = nodeLetterToNodeNumber(journey.getDestinationAirport());
int distance = journey.getNumberOfMilesToTravel();
addFlightPath(pathId, sourceAirport, destinationAirport, distance);
}
// Uncommenting this section of code allows the program to function normally
// addFlightPath("Path_AB", 0, 1, 800);
// addFlightPath("Path_BC", 1, 2, 900);
// addFlightPath("Path_CD", 2, 3, 400);
// addFlightPath("Path_BF", 1, 5, 400);
// addFlightPath("Path_DE", 3, 4, 300);
// addFlightPath("Path_EB", 4, 1, 600);
// addFlightPath("Path_CE", 2, 4, 200);
// addFlightPath("Path_DC", 3, 2, 700);
// addFlightPath("Path_EB", 4, 1, 500);
// addFlightPath("Path_FD", 5, 3, 200);
// addFlightPath("Path_DE", 3, 4, 400);
// addFlightPath("Path_CE", 2, 4, 300);
}
private void addFlightPath(String pathId, int sourceAirport, int destAirport, int distance)
{
Edge path = new Edge(pathId, nodes.get(sourceAirport), nodes.get(destAirport), distance);
flightPaths.add(path); //IndexOutOfBounds exception is thrown here
}
}
Stack Trace
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at core.dijkstras2.DijkstrasController.addFlightPath(DijkstrasController.java:83)
at core.dijkstras2.DijkstrasController.populateDijkstrasGraph(DijkstrasController.java:63)
at core.dijkstras2.DijkstrasController.<init>(DijkstrasController.java:19)
at core.dijkstras2.DDriver.main(DDriver.java:10)
So, the reason for this IndexOutOfBounds was being caused by the fact that the for loop in question prevented the nodes ArrayList from being populated properly.
To fix this, I simply changed this code:
for (int i = 0; i < (fdb.getDatabaseSize()); i++)
{
Vertex location = new Vertex("Node_" + i, nodeNumberToNodeLetter(i));
nodes.add(location);
//This block of code throws an IndexOutOfBounds error
AirJourney journey = fdb.getFlightDetails(i);
String pathId = "Path_" + journey.getOriginAirport() + journey.getDestinationAirport();
int sourceAirport = nodeLetterToNodeNumber(journey.getOriginAirport());
int destinationAirport = nodeLetterToNodeNumber(journey.getDestinationAirport());
int distance = journey.getNumberOfMilesToTravel();
addFlightPath(pathId, sourceAirport, destinationAirport, distance);
}
And moved the second block into a separate for loop, this allows the first for loop to populate the arraylist first, before the flight paths are added.
for (int i = 0; i < (fdb.getDatabaseSize()); i++)
{
Vertex location = new Vertex("Node_" + i, nodeNumberToNodeLetter(i));
nodes.add(location);
}
for (int i = 0; i < fdb.getDatabaseSize(); i++)
{
AirJourney journey = fdb.getFlightDetails(i);
String pathId = "Path_" + journey.getOriginAirport() + journey.getDestinationAirport();
int sourceAirport = nodeLetterToNodeNumber(journey.getOriginAirport());
int destinationAirport = nodeLetterToNodeNumber(journey.getDestinationAirport());
int distance = journey.getNumberOfMilesToTravel();
addFlightPath(pathId, sourceAirport, destinationAirport, distance);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With