当前位置: 首页 > 面试题库 >

ArrayIndexOutOfBound错误-Java

洪彬
2023-03-14
问题内容

我收到一个奇怪的错误,我不确定为什么有人可以发现错误在哪里?

错误:

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: -61
    at ca.serict.game.gfx.Screen.render(Screen.java:55)
    at ca.serict.game.entities.Player.render(Player.java:57)
    at ca.serict.game.level.Level.renderEntities(Level.java:67)
    at ca.serict.game.Game.render(Game.java:168)
    at ca.serict.game.Game.run(Game.java:127)
    at java.lang.Thread.run(Unknown Source)

如果您需要从任何这些行中查看代码,列出的错误仅请告诉我。

Screen.java第55行:

int col = (colour >> (sheet.pixels[xSheet + ySheet * sheet.width + tileOffset] * 8)) & 255;

Player.java第57行:

screen.render(xOffset,  + modifier, yOffset, (xTile + 1) + yTile * 32, colour);

Level.java第65-69行:

public void renderEntities(Screen screen) {
    for (Entity e : entities) {
        e.render(screen);
    }
}

Game.java第168行:

level.renderEntities(screen);

Game.java第157-128行:

    if (shouldRender) {
        frames++;
        render();
    }

屏幕55的公共无效:

public void render(int xPos, int yPos, int tile, int colour, int mirrorDir) {
    xPos -= xOffset;
    yPos -= yOffset;

    boolean mirrorX = (mirrorDir & BIT_MIRROR_X) > 0;
    boolean mirrorY = (mirrorDir & BIT_MIRROR_Y) > 0;

    int xTile = tile % 32;
    int yTile = tile / 32;
    int tileOffset = (xTile << 3) + (yTile << 3) * sheet.width;
    for (int y = 0; y < 8; y++) {
        if (y + yPos < -0 || y + yPos >= height)
            continue;
        int ySheet = y;
        if (mirrorY)
            ySheet = 7 - y;
        for (int x = 0; x < 8; x++) {
            if (x + xPos < -0 || x + xPos >= width)
                continue;
            int xSheet = x;
            if (mirrorX)
                xSheet = 7 - x;
            int col = (colour >> (sheet.pixels[xSheet + ySheet * sheet.width + tileOffset] * 8)) & 255;
            if (col < 255)
                pixels[(x + xPos) + (y + yPos) * width] = col;
        }
    }
}

问题答案:

因此,您正在使用以下表达式计算数组索引:

xSheet + ySheet * sheet.width + tileOffset

您需要确保该值在数组的范围内sheet.pixels。为此,您可以编写一个小的方法来固定索引:

public int clamp(int index, int start, int end) {
    return index > end ? end : index < 0 ? 0 : index;
}

并像这样使用它:

 int i = clamp((xSheet+ySheet*sheet.width+tileOffset),  0, sheet.pixels.length-1)
 sheet.pixels[i];

这样,您将确保索引在[0,sheet.pixels.length-1]范围内,但是仍然需要知道这对于您的用例是否有意义。



 类似资料:
  • 问题内容: 我目前正在从事一个学生项目,每次遇到此错误:。有人可以看到它的发生位置以及如何解决吗?我知道代码看起来很凌乱,但它只适合我。数组的大小为7。 问题答案: 您首先要检查c是否最多为数组的最后一个索引, 然后 将其递增1,可能将其推到该限制之上。

  • 我能够使用cloudera提供的示例jar在alluxio上运行wordcount,使用: 但是当我使用附带代码创建的jar时,我不能运行它,这也是一个示例wordcount示例代码 上面的代码是使用maven pom.xml文件构建的 你能帮我在alluxio集群中运行我的wordcount程序吗。希望没有额外的配置添加到pom文件运行相同。

  • 我试图使用javamail示例包中的ShowMsg.java读取gmail消息,但在运行时不断出现此错误。虽然程序编译得很好。 以下是错误消息: 我运行的命令是,编译它的命令是。javax.mail.jar包含在lib文件夹中 这是一些更短的替代代码,并得到相同的错误:

  • 这个问题已经问了好几次了,我跟着这些问题试图解决这个问题。该项目成功构建并运行了几个小时前我关闭了电脑。这个问题让我抓狂,请帮助。 留言: build.gradle: 请帮忙。

  • 问题内容: 我正在开发一个小的Spring应用程序。我必须将学生信息的详细信息存储在数据库中。我已经开发了一个SimpleFormController。我已经使用过NetBeans + Hibernate映射+ Spring。部署项目时,发生以下错误。 我的spring-config-db-applicationContext.xml如下所示: 发生以下错误: 问题答案: Hibernate要求的

  • 问题内容: 不知道为什么会收到此错误。这里有很多类似的问题,但到目前为止,没有一个问题对我有用。 我的 ivy文件是 而我的web.xml是 我已经解决了 ivy。仍然有错误。我还可以在eclipse中看到这个类。 我真的很纠结于此。如有任何帮助或建议,我们将不胜感激。 PS:我也尝试添加,但常春藤无法解决。我懂了 问题答案: Jar文件必须在中。或者你可以告诉,它可以在其他位置找到,而不仅仅是。