0

OK so I am getting an ArrayIndexOutofBoundsException. I don't know why.

Here's my code:

/**
Tile Generator
Programmer: Dan J.
Thanks to: g00se, pbl.
Started May 23, 2010
**/

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class tileGen extends Applet implements KeyListener  {


    Image[] tiles; // tile arrays
    Image player; // player image
    int x, y, px, py, tx, ty; // x tile - y tile // player x - player y // tile x - tile y
    boolean left, right, down, up, canMove; // is true?
    int[][] board; // row tiles for ultimate mapping experience!
    final int NUM_TILES = 33; // how many tiles are we implementing?
    Label lx, ly; // to see where we are!
    private static int BLOCKED = 28;

    int lastX, lastY, row, col;

  public void init() {

    board = loadBoard();

    tiles = new Image[NUM_TILES];
    for(int i = 0;i < NUM_TILES;i++) {
        tiles[i] = getImage(getClass().getResource(String.format("tiles/t%d.png", i)));
    }
        board[2][2] = BLOCKED;
        player = getImage(getClass().getResource("player.png")); // our player
        addKeyListener(this);
        canMove = true;
        px = 0;
        py = 0;
        lastX = 0;
        lastY= 0;
    }

    public void keyPressed(KeyEvent e) {

if (blocked(lastX,lastY) == true) {
    System.out.println("You were JUST on a BLOCKED tile!");
}

int x1 = lastX = lastX + 1;
int y1 = lastY;
       System.out.println("++++++++++++++++++++++++\n(" +x1+","+y1+") " + blocked(x1,y1) + "\n++++++++++++++++++++++++");

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = true;
            px = px - 32;
            lastX = lastX - 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = true;
            px = px + 32;
            lastX = lastX + 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            down = true;
            py = py + 32;
            lastY = lastY + 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            up = true;
            py = py - 32;
            lastY = lastY - 1;
        }



        repaint();
    }
public void keyReleased(KeyEvent e){} // ignore
public void keyTyped(KeyEvent e){} // ignore

  public void paint(Graphics g) {


        for (row = 0; row < board.length; row++) {
            for (col = 0; col < board[row].length; col++) {
                int index = board[row][col];
                g.drawImage(tiles[index], 32 * col, 32 * row, this);

            }
        }
        System.out.println("X: " + lastX + "\nY: " + lastY + "\n=============================\n");

System.out.println("Blocked tile?: " +blocked(lastX,lastY) + " ("+lastX + ","+lastY+")");
        g.drawImage(player, px, py, this);
    } // end paint method

     public void update(Graphics g)
     {
          paint(g);
     }

    public int[][] loadBoard() {
        int[][] board = {
                { 2,2,24,24,24,24,24,1,3,0,0,0 },
                { 2,2,24,23,23,23,24,1,3,0,0,0 },
                { 1,1,24,23,23,23,24,1,3,3,3,3 },
                { 1,1,24,24,23,24,24,1,1,1,1,1 },
                { 1,1,1,1,7,1,1,1,1,1,3,3 },
                { 5,1,1,1,7,7,7,7,7,1,3,3 },
                { 6,1,3,1,1,1,1,1,7,7,7,3 },
                { 6,1,3,1,3,1,3,1,1,1,7,3 }
            };
    return board;
    }

    public boolean blocked(int tx, int ty) {

            return board[tx][ty] == BLOCKED;
        }

} // end whole thing

The thing is when I go to the red brick at board[2][2]... I go there. Then I go up... then I TRY go to back down but that error pops up. Also when I go to the right 8 squares... I ALSO get that error.

ALSO, pretend my 2d map is split into FOUR squares... well square one is the top left... if I go ANYWHERE else ... I get that error.

What am I doing wrong? Thanks.

update: i found the culprit! It's the lastX and lastY updates when I press the key! But I still can't figure out to fix this array out of bounds! :(

Here is the error: Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 8 at tileGen.blocked(tileGen.java:111) at tileGen.paint(tileGen.java:86) at tileGen.update(tileGen.java:92) at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239) at sun.awt.RepaintArea.paint(RepaintArea.java:216) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:306) at java.awt.Component.dispatchEventImpl(Component.java:4706) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)</code>
wattostudios
  • 8,446
  • 13
  • 40
  • 54
test
  • 15,464
  • 61
  • 155
  • 235
  • You need to tell us where which line you're getting the error from etc. – polygenelubricants May 30 '10 at 05:43
  • OK I updated the main question. – test May 30 '10 at 05:54
  • `int x1 = lastX = lastX + 1;` why are you doing `lastX = lastX + 1` here? It looks like the exception happens in `blocked` when `tx == 8`. – polygenelubricants May 30 '10 at 06:06
  • I'm also unsure exactly where the error is coming from, but you might want to ensure that you've got all your coordinate systems figured out. 2D arrays are `array[row][col]`, and graphics in Java is `(col, row)` with the origin at the upper left and the y-axis upside-down. I see that your call to `Graphics.drawImage` correctly orders `col` and `row`, but couldn't quite make out whether every other `x` and `y` do the right thing. – jasonmp85 May 30 '10 at 06:25
  • That's funny.. I can't go past board[-1][-1] such as board[-2][-2] :( – test May 30 '10 at 21:26

1 Answers1

2

Generally speaking, an ArrayIndexOutOfBoundsException is thrown when there's an attempt to access an array element at an index that is out of bounds.

The following snippet shows some scenarios (independent of each other) where ArrayIndexOutOfBoundsException are thrown:

    // 1
    int[] x = new int[5];
    x[-1] = 0; // ArrayIndexOutOfBoundsException: -1

    // 2
    int[] x = new int[5];
    x[5] = 0; // ArrayIndexOutOfBoundsException: 5

    // 3
    int[][] table = new int[3][3];
    table[0][10] = 0; // ArrayIndexOutOfBoundsException: 10

    // 4
    int[][] table = new int[3][3];
    table[-10][10] = 0; // ArrayIndexOutOfBoundsException: -10

    // 5
    int[][][][] whoa = new int[0][0][0][0];
    whoa[0][-1][-2][-3] = 42; // ArrayIndexOutOfBoundsException: 0

    // 6
    int[][][][] whoa = new int[1][2][3][4];
    whoa[0][1][2][-1] = 42; // ArrayIndexOutOfBoundsException: -1

Where and how this happens in your applet is unclear, but rest assured that it happens for the right reason: you've illegally tried to access an array element at an invalid index, and since arrays are bound-checked at run-time in Java, the run-time exception is raised.

You may want to bring out the debugger to see how the invalid index was evaluated, but if nothing else, lots of System.out.println wherever you're mutating the index and wherever you're about to access an array element can help locate the bug.


Additional tips:

Instead of:

lastX = lastX + 1;
lastY = lastY - 1;

You can do:

lastX++;
lastY--;

This is called the "post-increment" and "post-decrement" operators. Used judiciously, it can improve readability.

References

polygenelubricants
  • 348,637
  • 121
  • 546
  • 611