sách gpt4 ai đã đi

Java Applet - ArrayIndexOutOfBoundsException

In lại 作者:行者123 更新时间:2023-12-02 08:32:39 31 4
mua khóa gpt4 Nike

好的,我收到了 ArrayIndexOutofBoundsException。我不知道为什么。

Đây là mã của tôi:

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

nhập java.awt.*;
nhập 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

事情是当我去board[2][2]的红砖时... 我去那儿。然后我上去...然后我尝试后退,但弹出了该错误。另外,当我转到右边的 8 个方格时...我也收到该错误。

另外,假设我的二维 map 被分成四个方 block ...第一个方 block 是左上角...如果我去任何其他地方...我会得到这个错误。

我做错了什么?谢谢。

更新:我找到了罪魁祸首!当我按下该键时,这是最后一次更新和最后一次更新!但我仍然不知道如何修复这个数组越界! :(

错误如下: 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)

1 Câu trả lời

一般来说,ArrayIndexOutOfBoundsException当尝试访问越界索引处的数组元素时,会抛出此错误。

以下代码片段显示了抛出 ArrayIndexOutOfBoundsException 的一些场景(彼此独立):

    // 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

这种情况在您的小程序中发生在哪里以及如何发生尚不清楚,但请放心,它发生的原因是正确的:您非法尝试访问无效索引处的数组元素,并且由于数组在运行时进行了绑定(bind)检查 - Java 中的时间,会引发运行时异常。

您可能想打开调试器来查看无效索引是如何评估的,但如果没有别的,无论您在何处更改索引,无论您在何处,都会有大量 System.out.println即将访问数组元素可以帮助定位错误。

<小时>

其他提示:

而不是:

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

Bạn có thể làm như sau:

lastX++;
lastY--;

这称为“后递增”和“后递减”运算符。明智地使用它可以提高可读性。

引用文献

关于Java Applet - ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937657/

31 4 0
Bài viết được đề xuất: java - 如何扩展 JNA 接口(interface)映射? ( java )
Bài viết được đề xuất: java - java中的新行
Bài viết được đề xuất: java - 为什么会抛出索引越界异常?
Bài viết được đề xuất: java - jsfunit 与 junit 4
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com