如何解决此数组超出范围的异常?

时间:2016-09-13 12:44:44

标签: java indexoutofboundsexception bufferedimage

你好基于氢的生命形式。我学习如何从一个绝密网站(www.youtube.com)制作三维视频,我从一个非常好的Youtuber学习。我的项目看起来像这样:

  

有3个类:Main,Screen和Render   我得到了这个例外:(:

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 65600
at Render.Draw(Render.java:20)
at Screen.render(Screen.java:19)
at Main.render(Main.java:74)
at Main.run(Main.java:59)
at java.lang.Thread.run(Unknown Source)

我将在此处上传我的代码。请帮助我擅长这个。

主要课程:

import java.awt.Canvas;  
import java.awt.Graphics;  
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

import javax.swing.JFrame;  

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

public static final int WIDTH = 800;
public static final int HEIGHT = 600;
public static final String TITLE = "Nexus Overload";

private Thread t;
private boolean Running = false;

@SuppressWarnings("unused")
private Render ren;
private Screen s;

private BufferedImage img;
private BufferStrategy bs;
private int[] pixels;

public Main() {
    s = new Screen(WIDTH, HEIGHT);
    img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
}

private void start() {
    if (Running)
        return;
    Running = true;

    t = new Thread(this);
    t.start();
}

@SuppressWarnings("unused")
private void stop() {
    if (!Running)
        return;
    Running = false;
    try {
        t.join();
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }
}

public void run() {
    while (Running) {
        tick();
        render();
    }
}

private void tick() {

}

private void render() {
    bs = this.getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return; 
    }

    s.render();

    for (int i = 0; i < WIDTH * HEIGHT; i++) {
        pixels[i] = s.pixels[i];
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(img, WIDTH, HEIGHT, null);
    g.dispose();
    bs.show();

}

public static void main(String[] args) {
    Main m = new Main();

    JFrame frame = new JFrame();
    frame.getContentPane().add(m);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(350, 100, WIDTH, HEIGHT);
    frame.setTitle(TITLE);
    frame.setVisible(true);

    m.start();
}
}

渲染类:

public class Render {
public final int width;
public final int height;
public final int[] pixels;

public Render(int width, int height) {
    this.width = width;
    this.height = height;
    this.pixels = new int[width * height];
}

public void Draw (Render ren, int xOffset, int yOffset) {
    for (int y = 0; y < ren.height; y++) {
        int yPix = y + yOffset;

        for (int x = 0; x < ren.width; x++) {
            int xPix = x + xOffset;

            pixels[xPix + yPix * width] = ren.pixels[xPix + yPix * width];
        }
    }
}
}

屏幕类:

import java.util.Random;

public class Screen extends Render{

private Render ren;

public Screen(int width, int height) {
    super(width, height);

    Random r = new Random();

    ren = new Render(256, 256);
    for (int i = 0; i < 256 * 256; i++) {
        ren.pixels[i] = r.nextInt();
    }
}

public void render() {
    Draw(ren, 0, 0);
}

}

对于那些想要使用eclipse调试图像的人,这里: 选择变量选项卡: enter image description here

1 个答案:

答案 0 :(得分:0)

您的异常将我们指向Render类中的Draw方法(注意:Java约定声明方法名称应该是小写的,因此该方法实际上应该称为draw(Render ren,int xOffset,int yOffset)。我会首先尝试将外部for循环中的int y设置为1以查看是否有帮助,您也可以对内部for循环中的int x执行相同操作...