2016-09-13 63 views
1

你好同胞氫基生命形式。我學習如何從一個絕密網站(www.youtube.com)製作三維圖像,我從一個非常好的Youtuber那裏學習。我的項目是這樣的:我該如何解決這個數組越界異常?

有3類:主,屏幕和渲染 我得到這個例外:(:

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]; 
     } 
    } 
} 
} 

Screen類:

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

+4

我們不是氫 - 基於碳,我們是基於碳的:)另外,你不知道如何跟蹤堆棧跟蹤? –

+0

使用調試器後發現了什麼? – MrSmith42

+0

@SomePerson我現在從哪裏來,但我似乎無法解決 –

回答

0

你的例外是指向我們到Render類中的Draw方法(注意:Java約定聲明方法名稱應該是小寫的,所以這個方法實際上應該是b e叫draw(Render ren,int xOffset,int yOffset)。我會首先嚐試並將外部for循環中的int y設置爲1以查看是否有幫助,您可能也會對內部for循環中的int x執行相同操作...

+0

評論在這裏,因爲我沒有足夠的代表評論的OP - 你可以採取與調試視圖中選擇的變量選項卡上述相同的屏幕截圖上面? – coderwurst

+0

好吧現在就可以做到這一點 –