Toon posts:

[java] ArrayIndexOutOfBoundsException

Pagina: 1
Acties:

Onderwerpen


  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 08-06 15:30

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.


  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:53
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.

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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.

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 19:23

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!"


  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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);
                }

            }
        }
    }

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 01:59
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;){

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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 :)

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

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 03-05 21:22
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... |:(

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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee