[java] ArrayIndexOutOfBoundsException

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Hey,

Ik ben bezig met een project genaamd Sokoban.
Dit is een spelletje waarmee je met een poppetje door een level loopt en dozen op een eindveld moet schuiven.

Oke, ik wil een 2 dimensional array vullen met verschillende Veld objecten.
Maar nu krijg ik de onderstaande foutmelding:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 9

Als ik het goed heb begrepen houdt dit in dat ik een index in de array willen vullen die niet bestaat.

Dus dan zou of mijn array demension of mijn for loop niet goed moeten zijn.

Maar zie echt niet waar ik de fout ben in gegaan.

Als iemand de moeite zou willen nemen om even een kijkje te nemen in mij code zou ik dat erg op prijs stellen.

ps: in de string map zouden nog wat spaties moeten staan maar die haalt hij eruit dus vandaar dat het zo rommelig eruit ziet

Code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private Veld veld [][];

public void maakLevel(){

        String map= "#############\n"+
                    "#           #\n"+
                    "#  $  ##    #\n"+
                    "#  $  ##    #\n"+
                    "#       $   #\n"+
                    "#  @  ##    #\n"+
                    "#     ##    #\n"+
                    "#...        #\n"+
                    "#############\n";
        String regels[] = map.split("\n");
        veld = new Veld[regels.length][regels[0].length()];
        int row = 0;

        for (String regel : regels){
            for (int c = 0; c < regel.length(); c++){

            char item = regel.charAt(c);

            if(item == '#'){
                veld[row][c] = new Muurveld(row,c);

            }
            row ++;
        }
    
    }
}


Staat nog een lap code onder voor de andere tekens zoals (@,$, enz) maar die kan ik zelf wel fixen zodra de 1e lukt.

Donny

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 12-07 23:36

NMe

Quia Ego Sic Dico.

Wat zegt je debugger op die regel waar het fout gaat? Welke index van welk array probeer je aan te spreken? Hoe groot is die array? Hoe groot is je index?

Verder: Waar hoort mijn topic? Dit is een programmeerprobleem, niet een ontwerpprobleem; ik verplaats je topic dan ook. En voor het posten van code: Hoe post je code? / Hoe gebruik je de code tag?

Nog een algemene tip: zorg voor goede indenting. Ik moest drie keer kijken om te zien onder welke loop die row ++ op regel 27 nou viel.

[ Voor 3% gewijzigd door NMe op 02-06-2011 15:12 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
NMe schreef op donderdag 02 juni 2011 @ 15:11:
Wat zegt je debugger op die regel waar het fout gaat? Welke index van welk array probeer je aan te spreken? Hoe groot is die array? Hoe groot is je index?

Verder: Waar hoort mijn topic? Dit is een programmeerprobleem, niet een ontwerpprobleem; ik verplaats je topic dan ook. En voor het posten van code: Hoe post je code? / Hoe gebruik je de code tag?

Nog een algemene tip: zorg voor goede indenting. Ik moest drie keer kijken om te zien onder welke loop die row ++ op regel 27 nou viel.
Bedankt voor de feedback, ik heb het probleem gevonden.
Ging even kijken naar me indenting en zag dat me row++ nog binnen de 2e for zat.
Dus vandaar die index out of bounds.
Domme fout die me 2 uur zoeken heeft gekost |:(
Maar nu is er nog iets niet in orde, hij zit blijkbaar in een oneindige for loop

[ Voor 4% gewijzigd door DonnyR op 02-06-2011 15:24 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 10-07 20:18
Of het je oneindige lus oplost weet ik niet, maar je veldbeschrijving is momenteel niet bepaald rechthoekig. Dat lijkt me ook niet de bedoeling! Zo is de eerste regel bijvoorbeeld korter dan de tweede, waardoor je geheid problemen gaat krijgen aangezien de breedte van je veld-array bepaald wordt door de lengte van de eerste regel.

Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Soultaker schreef op donderdag 02 juni 2011 @ 15:29:
Of het je oneindige lus oplost weet ik niet, maar je veldbeschrijving is momenteel niet bepaald rechthoekig. Dat lijkt me ook niet de bedoeling! Zo is de eerste regel bijvoorbeeld korter dan de tweede, waardoor je geheid problemen gaat krijgen aangezien de breedte van je veld-array bepaald wordt door de lengte van de eerste regel.
Hij was in me code wel gewoon recht, heb hem hier ook even aangepast.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 12-07 21:22

NetForce1

(inspiratie == 0) -> true

Als ik het zo snel zie lijkt je oneindige loop niet in dit stuk code te zitten. Dmv een debugger, of output naar de console printen kun je snel genoeg zien welk stuk code de oorzaak is.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
NetForce1 schreef op donderdag 02 juni 2011 @ 17:04:
Als ik het zo snel zie lijkt je oneindige loop niet in dit stuk code te zitten. Dmv een debugger, of output naar de console printen kun je snel genoeg zien welk stuk code de oorzaak is.
Klopt ja,
Zodra ik de method tekenObjecten aanroep in paintComponent(), wordt me spel zwart en kan ik hem enkel afsluiten via taakbeheer.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static final int Hokje = 20;

    public void tekenObjecten(Graphics g){
        for (int row = 0; row < veld.length; row++){
            for (int col = 0; col < veld[0].length;){
                                
                if (veld[row][col] instanceof Muurveld){
                    g.setColor(Color.RED);
                    g.fill3DRect(veld[row][col].getxPosition(), veld[row][col].getyPosition(), Hokje, Hokje, true);
                }

            }
        }
    }

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 00:20
Geen idee waar de fout zit, maar mocht je ooit per ongeluk niet rechthoekige maps krijgen, dan lijkt het me dat dit wel eens een probleem gaat opleveren:
Java:
1
for (int col = 0; col < veld[0].length;){

Je kan het beter die 0 veranderen in row
Java:
1
for (int col = 0; col < veld[row].length;){

Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Caelorum schreef op donderdag 02 juni 2011 @ 18:46:
[...]

Geen idee waar de fout zit, maar mocht je ooit per ongeluk niet rechthoekige maps krijgen, dan lijkt het me dat dit wel eens een probleem gaat opleveren:
Java:
1
for (int col = 0; col < veld[0].length;){

Je kan het beter die 0 veranderen in row
Java:
1
for (int col = 0; col < veld[row].length;){
Bedankt voor de tip en moeite :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 10-07 20:18
Mist daar op die regel met de for-lus niet gewoon nog een col++ op het eind?

Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Soultaker schreef op donderdag 02 juni 2011 @ 20:02:
Mist daar op die regel met de for-lus niet gewoon nog een col++ op het eind?
Wow je bent een held!
Dat was het!
Altijd iets heel erg logisch doe ik fout... |:(

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 00:20
Haha ik had em ook niet gezien. Mooi gespot soultaker :)
Pagina: 1