有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arrays Java:ArrayIndexOutofBounds尝试更改矩形位置时发生异常

我正在开发一个Java游戏,目前正在编写一个地图生成器。我可以制作地图并绘制分幅,但我需要能够更改这些分幅的位置,以便角色可以看到地图的不同位置。当我试图更改它时,在moveMap()方法中,它给出了以下错误:

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 570
at Base.moveMap(Base.java:88)
at Base.run(Base.java:55)
at java.lang.Thread.run(Unknown Source)

我不知道为什么会发生这种情况——请有人帮我理解这个问题。是否有其他方法移动瓷砖

这是我的密码

public class Base extends JPanel implements Runnable {

    private static String[] line = { 
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwfffffffffffwwwwwwwwwww", 
        "wwwwwwffwwwwwwwwfwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwfffffffwwwfwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwffffffwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwffffffwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwfffffffwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", 
        "wwwwwwffwwwwwwwwwwwwwwffffffffwwwwwwww",
        "wwwwwwffwwwwwwwwwwwwwwwwwwwwffwwwwwwww",
        "wwwwffffffwwwwwwwwwwwwwwwwwwffwwwwwwww",
        "wwwwffffffffffffffffffffffffffwwwwwwww",
        "wwwwffffffwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",};

    private Rectangle[] colRect;

    private int tileWidth = 30;
    private int tileHeight = 30;

    public Base() {
        colRect = new Rectangle[line.length * line[0].length()];
        for (int i = 0; i < line.length; i++) {
            for (int f = 0; f < line[i].length(); f++) {
                colRect[counter] = new Rectangle(f * tileWidth, i * tileHeight,tileWidth, tileHeight);
                if (counter != colRect.length) {
                    counter += 1;
                }
            }
        }
    }

    public void moveMap(){
        for(int i = 0; i <= colRect.length; i++){
            colRect[i].setLocation(colRect[i].x+1, colRect[i].y+1);
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    你几乎可以肯定地说:

    for (int i = 0; i < colRect.length; i++) {
    

    与此相反:

    for(int i = 0; i <= colRect.length; i++){
    

    请记住,如果数组的长度为n,则索引从0变为n-1

  2. # 2 楼答案

    我建议您只修改几何体的访问器,而不是地图本身。因为函数moveMap看起来可能有某种“循环”行为

    getLocation (int index, offset = 0){
        int accIndex = (index + offset) % colRect.length;
        // ... probably better to modify your data-structure to simplify the handling
    }