Kesalahan di luar batas pengecualian saat menjalankan program rekursif di Java

Saya belajar tentang rekursi sebagai bagian dari tutorial Java dan saya mencari sedikit bantuan.

Kita perlu membuat program Java rekursif yang akan mengetahui cara berpindah dari satu kota ke kota lain ketika tidak ada penerbangan langsung.

Masalah terbaru saya adalah saya mendapatkan kesalahan pengecualian di luar batas setelah kode memiliki 2 kota dalam Daftar array flightRoute. itu memberikan kesalahan "IndexOutOfBoundsException Indeks 2 Ukuran 2"

Nilai koneksinya adalah arrayList yang mengambil semua kota yang terhubung dengan kota tersebut dan flightRoute juga merupakan arrayList yang melacak kota-kota yang harus kita kunjungi untuk mencapai tujuan kita.

Saya tidak tahu mengapa hal itu tidak dilanjutkan.

Saya akan sangat menghargai bantuan dalam hal ini jika Anda bisa.

Saya tidak ingin membanjiri kalian dengan kode jadi saya akan memberikan metode yang Anda perlukan. Jika Anda membutuhkan lebih banyak, saya dengan senang hati akan menambahkan beberapa kode lagi.

    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 sumber
comment
Kode contoh Anda menggunakan i, tetapi tidak menunjukkan dari mana asalnya... atau mengapa Anda berharap dapat menambahnya dan meminta Connections.get(i) tanpa masalah...   -  person Jon Skeet    schedule 26.09.2011


Jawaban (2)


Di mana Anda menetapkan nilai i? Lagi pula, satu-satunya get() yang Anda gunakan i sebagai indeks, jadi jelas bahwa Connections tidak memiliki item sebanyak i.

OMONG-OMONG:

a) Tanda waktu berikutnya di baris mana pengecualian dilempar (dari apa yang saya lihat, mungkin get() pertama

b) gunakan huruf kecil untuk nama variabel: connections bukannya Connections

person SJuan76    schedule 26.09.2011
comment
i diinisialisasi di awal file seperti pada private int flightRouteSize, i =0; dan Pengecualian dilemparkan pada baris city theCity = Connections.get(i); serta pada metode rekursif itu sendiri di bawah ini - person Binyomin; 26.09.2011
comment
karena Anda selalu menambah i, dan saya bertaruh pada bagian lain dari kode, lebih dari biasanya Anda akan mendapatkan kesalahan ini... Anda perlu membuat instance variabel i dalam kode ini, sehingga kapan pun dipanggil itu disetel ulang ke 0, juga, Anda harus menjalankan kode ini dalam satu lingkaran. - person Gonçalo Vieira; 26.09.2011

Masalahnya adalah i tidak dideklarasikan secara lokal, jadi Anda selalu menambah beberapa variabel instan. Deklarasikan secara lokal dan setel ke nol.

Sebelum Anda dapat membuat kemajuan nyata dalam memperbaiki kode ini, saya sarankan Anda membersihkannya:

  • Beri nama variabel dengan huruf kecil di depannya - yaitu connections bukan Connections
  • Gunakan variabel lokal jika masuk akal - seperti connections
  • Hapus kode yang tidak masuk akal, seperti pengujian apakah 7 > 8 benar - tentu saja selalu benar!
  • Gunakan lekukan blok yang tepat
  • Ulangi koleksi menggunakan loop "foreach": for (City city : from.getConnections())
  • Cenderung memberi nama variabel Anda sama dengan nama kelas, tetapi dengan huruf kecil, jadi city, bukan theCity
person Bohemian♦    schedule 26.09.2011
comment
Terima kasih atas bantuan Anda. Saya akan memperbaiki kode saya dan membuatnya lebih mudah dibaca, ada baiknya Anda memberi tahu saya hal ini karena saya ingin membuat kode dengan cara yang benar dan saya hanya dapat mempelajarinya jika orang lain memberi tahu saya di mana kesalahan saya. Sehubungan dengan kode, apakah lebih baik saya menghilangkan penghitung i dan menyelesaikannya? Saya telah melihat kode ini begitu lama dan tidak tahu lagi apa yang terbang dengannya. :) - person Binyomin; 26.09.2011