二维像素数组上的 java.lang.ArrayIndexOutOfBoundsException

标签 java arrays

我正在尝试制作一个简单的游戏,您可以在其中边走边捡木棍。我使用 2D 像素阵列跟踪所有图形输出和动画。在 clear() 期间,我将所有像素值设置为 0,它给了我一个 ArrayIndexOutOfBoundsException

输出:

Exception in thread "Display" java.lang.ArrayIndexOutOfBoundsException: 225
at com.game.sticks.Game.render(Game.java:105)
at com.game.sticks.Game.run(Game.java:82)
at java.lang.Thread.run(Unknown Source)

主要代码:

package com.game.sticks;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

import com.game.sticks.Graphics.Screen;
import com.game.sticks.Player.Player;

public class Game extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;

public static int width = 400;
public static int height = width / 16 * 9;
public static int scale = 3;
public static String title = "Pickn' Sticks";

boolean running = false;
JFrame frame = new JFrame();
Thread thread;

private Stick stick;
private Player player;

public int[][] pixels = new int[width][height];

public BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

public Game() {
}

Game(int i) {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

}

public synchronized void start() {

    thread = new Thread(this,"Display");
    stick = new Stick();
    player = new Player();

    running = true;

    thread.start();

}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    Game game = new Game(1);

    game.frame.setVisible(true);
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.frame.add(game);
    game.frame.pack();
    game.frame.setLocationRelativeTo(null);
    game.frame.setResizable(false);
    game.frame.setTitle(title);

    game.start();
}

public void run() {
    setFocusable(true);
    while (running) {
        update();
        render();
    }
    stop();
}

public void update() {
    player.update();
    System.out.println("updating");

}

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    clear();

    for(int i = 0;i<width;i++) {
        for(int i2 = 0;i2<height;i++) {
            pixels[i][i2] = -4325345;
        }
    }

    for(int x = 0;x < width;x++) {
        for(int y = 0;y < height;y++) {
            image.setRGB(x,y,pixels[x][y]);
        }
    }

    System.out.println("rendering");

    Graphics g = bs.getDrawGraphics();
    g = bs.getDrawGraphics();
    g.setColor(Color.green);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    g.dispose();
    bs.show();
}

private void clear() {
    for(int i = 0; i<width; i++) {
        for(int i2 = 0; i2<height; i++) {
            pixels[i][i2] = 0;
        }
    }
}
}

我该如何解决这个异常?

最佳答案

你有两种类型。首先,在第 104 行的 for 循环中,增量器应该是 i2++ 而不是 i++。它应该看起来像这样:

for(int i = 0;i<width;i++) {
    for(int i2 = 0;i2<height;i2++) { //The change is from i++ to i2++
        pixels[i][i2] = -4325345;
    }
}

您在代码底部的 clear() 方法中也有同样的问题。

关于二维像素数组上的 java.lang.ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36512636/

相关文章:

php - 重置 MySqli 指针?

java - 测试执行期间上下文中的模拟对象

java - 展平集合

java - Spring MVC/Rest - 返回标准响应

c++ - 在 C++ 中动态声明二维数组

PHP 本地化 - gettext 或 array?

java - 共享 Eclipse 启动配置的最佳实践

java - 如何向后打印文件内容?

java - 在 Java 中将 JList 选择存储在数组 String[] 中

java - 如何正确合并两个已排序的数组?