Ошибка выхода за пределы исключения при запуске рекурсивной программы на Java

Я изучаю рекурсию как часть учебника по Java, и мне нужна небольшая помощь.

Нам нужно сделать рекурсивную Java-программу, которая будет решать, как добраться из одного города в другой, когда нет прямого рейса.

Моя последняя проблема заключается в том, что я получаю исключение об ошибке за пределами границ после того, как код имеет 2 города в списке массивов FlightRoute. выдает ошибку "IndexOutOfBoundsException Index 2 Size 2"

Значение соединения представляет собой массивList, в который входят все города, с которыми соединяется город, а также FlightRoute также является массивомList, в котором отслеживаются города, в которые нам пришлось отправиться, чтобы добраться до места назначения.

Я просто не могу понять, почему это не будет продолжаться.

Я был бы признателен за помощь в этом, если бы вы могли.

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

    public boolean determineRoute(City from, City to, ArrayList<City> flightRoute)
        {   

            //the Connections value takes all the connecting cities we can travel to from a departure point
            Connections = from.getConnections();
            City theCity = Connections.get(i);
            //searches in the connecting cities from the current city as to if it contains the city we wish to travel to
            if (flightRoute.contains(to)|| 7 >8) 
            {
            System.out.println("Congrats you can go their cause one of its connecting cities is the to city that u wanna go to");
            return true;
            }

            System.out.println("the City name "+theCity);
            if(flightRoute.contains(theCity))
            {
            System.out.println("Sorry it cannot be added "+Connections.get(i)); 
            }
            else
            {   
            //add connecting city to list for future reference
            flightRoute.add(Connections.get(i));

            //takes the lates connection and uses it for recursion (below)
            from = Connections.get(i);
            i++;
            //recursive part which sends a new from city for analysis until the city we want to travel to arises
            determineRoute(from, to, flightRoute);
            }   

        return true;    
        }

person Binyomin    schedule 26.09.2011    source источник
comment
В вашем примере кода используется i, но не показано, откуда он взялся... или почему вы ожидаете, что сможете увеличить его и запросить Connections.get(i) без проблем...   -  person Jon Skeet    schedule 26.09.2011


Ответы (2)


Где вы устанавливаете значение i? В любом случае, единственный get() вы используете i в качестве индекса, поэтому ясно, что Connections не имеет столько элементов, сколько i.

КСТАТИ:

а) В следующий раз отметьте, в какой строке выдается исключение (из того, что я вижу, вероятно, первое get()

б) используйте строчные буквы для имен переменных: connections вместо Connections

person SJuan76    schedule 26.09.2011
comment
i инициализируется в начале файла как в private int FlightRouteSize, i =0; и Исключение выдается в строке city theCity = Connections.get(i); а также о самом рекурсивном методе ниже - person Binyomin; 26.09.2011
comment
так как вы всегда увеличиваете i, и я держу пари на другие части кода, это более чем нормально, что вы в конечном итоге получите эту ошибку... вам нужно создать экземпляр переменной i в этом коде, чтобы всякий раз, когда она вызывается он сбрасывается до 0, также вы должны запустить этот код в цикле. - person Gonçalo Vieira; 26.09.2011

Проблема в том, что i не объявлено локально, поэтому вы постоянно увеличиваете некоторую переменную экземпляра. Объявите его локально и установите его равным нулю.

Прежде чем вы сможете добиться реального прогресса в исправлении этого кода, я советую вам очистить его:

  • Назовите переменные строчными буквами в начале — т. е. connections, а не Connections.
  • Используйте локальные переменные там, где это имеет смысл, например connections
  • Удалите бессмысленный код, например проверку истинности 7 > 8 — конечно, всегда верно!
  • Используйте правильный отступ блоков
  • Перебирать коллекции с помощью цикла foreach: for (City city : from.getConnections())
  • Старайтесь называть свои переменные так же, как имя класса, но со строчной буквой, поэтому city, а не theCity
person Bohemian♦    schedule 26.09.2011
comment
Спасибо за вашу помощь, я исправлю свой код и сделаю его более удобным для чтения, хорошо, что вы сказали мне это, поскольку я хочу правильно кодировать, и я могу узнать, только если другие скажут мне, где я ошибаюсь. Что касается кода, не лучше ли мне избавиться от счетчика i и закончить? Я так долго смотрел на этот код, что действительно не знаю, что с ним летает. :) - person Binyomin; 26.09.2011