java.lang.ArrayIndexOutofBounds2D像素阵列上的异常

java.lang.ArrayIndexOutofBounds2D像素阵列上的异常,java,arrays,Java,Arrays,我试着做一个简单的游戏,你可以走着捡棍子。我使用2D像素阵列跟踪所有图形输出和动画。在我将所有像素值设置为0的clear()过程中,它会给我一个ArrayIndexOutOfBoundsException 输出: Exception in thread "Display" java.lang.ArrayIndexOutOfBoundsException: 225 at com.game.sticks.Game.render(Game.java:105) at com.game.sticks.Ga

我试着做一个简单的游戏,你可以走着捡棍子。我使用2D像素阵列跟踪所有图形输出和动画。在我将所有像素值设置为0的
clear()
过程中,它会给我一个
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;
        }
    }
}
}
package com.game.sticks;
导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.image.BufferStrategy;
导入java.awt.image.buffereImage;
导入javax.swing.JFrame;
导入com.game.sticks.Graphics.Screen;
导入com.game.sticks.Player.Player;
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=1L;
公共静态整数宽度=400;
公共静态内部高度=宽度/16*9;
公共静态int标度=3;
公共静态字符串title=“Pickn”Sticks”;
布尔运行=假;
JFrame=新JFrame();
螺纹;
私人棍棒;
私人玩家;
公共整数[]像素=新整数[宽度][高度];
公共BuffereImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
公共游戏(){
}
游戏(国际一){
尺寸尺寸=新尺寸(宽度*比例,高度*比例);
设置首选大小(大小);
}
公共同步的void start(){
线程=新线程(此“显示”);
斗杆=新斗杆();
player=新玩家();
运行=真;
thread.start();
}
公共同步无效停止(){
运行=错误;
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
游戏=新游戏(1);
game.frame.setVisible(true);
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.add(游戏);
game.frame.pack();
game.frame.setLocationRelativeTo(空);
game.frame.setresizeable(false);
游戏.框架.设置标题(标题);
game.start();
}
公开募捐{
设置聚焦(真);
(跑步时){
更新();
render();
}
停止();
}
公共无效更新(){
player.update();
System.out.println(“更新”);
}
公共无效呈现(){
BufferStrategy bs=getBufferStrategy();
如果(bs==null){
创新战略(3);
返回;
}
清除();

对于(inti=0;i您的内部for循环中有一个输入错误。您应该增加i2而不是i

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

for(int i=0;i有两种类型。首先,在第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;
    }
}

for(inti=0;i您的程序实际上犯了两个错误。因为您只需复制和粘贴代码

第一个是
private void clear()
方法


谢谢。我当时正在复制和粘贴嵌套for循环,我想我犯了一个愚蠢的错误。我现在会注意的。
private void clear() {
    for(int i = 0;i<width;i++) {
        for(int i2 = 0;i2<height;i++) {
            pixels[i][i2] = 0;
        }
    }
}
for(int i = 0;i<width;i++) {
        for(int i2 = 0;i2<height;i++) {
            pixels[i][i2] = -4325345;
        }
    }