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>
Generally speaking, an
ArrayIndexOutOfBoundsExceptionis 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
ArrayIndexOutOfBoundsExceptionare thrown: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.printlnwherever you’re mutating the index and wherever you’re about to access an array element can help locate the bug.Additional tips:
Instead of:
You can do:
This is called the “post-increment” and “post-decrement” operators. Used judiciously, it can improve readability.
References