1

Ich habe versucht, ein 3D-Spiel zu machen und aus irgendeinem Grund wirft mein Code eine NullPointerException. Der Fehler Ich erhalte ist:Warum wirft meine BufferStrategy eine NullpointerException und wie behebe ich sie?

Exception in thread "Thread-3" 
java.lang.NullPointerException 
at Display_3d.render(Display_3d.java:73) 
at Display_3d.run(Display_3d.java:55) 
at java.lang.Thread.run(Unknown Source) 

Dieses Programm soll nur Pixel von einer zufälligen Farbe als Test, um anzuzeigen, um später die 3D-Grafiken zu machen. Es gibt zwei andere Klassen, die es benutzt, und obwohl diese beiden keine Fehler werfen, könnten sie immer noch das Problem sein, also werde ich sie auch posten. Die Klasse Unten ist derjenige, der die Fehler

import java.awt.Canvas; 
import javax.swing.JFrame; 
import java.awt.image.BufferedImage; 
import java.awt.image.BufferStrategy; 
import java.awt.image.DataBufferInt; 
import java.awt.Graphics; 

public class Display_3d 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 = "Scott's Game Pre-Alpha 0.01"; 

private Thread thread; 
private Screen screen; 
private BufferedImage img; 
private boolean running = false; 
private Render render; 
private int[] pixels; 

public Display_3d(){ 
    Screen screen = 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; 
Thread thread = new Thread(this); 
thread.start(); 

System.out.println("start() has been called sucessfully"); 
} 

private void stop(){ 
if (true != running){ 
    return; 
} 
running = false; 
try { 
    thread.join(); 
}catch (Exception e){ 
    e.printStackTrace(); 
    System.exit(0); 
} 
} 

public void run(){ 
    while (running){ 
    tick(); 
/*Line 55*/render(); 

} 
} 

private void tick(){ 

} 

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

    return; 
    } 


    /*Line 73*/ screen.render(); 

    for (int i = 0; i<width*height-1; i++){ 
    pixels[i] = screen.pixels[i]; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    g.drawImage(img,0,0,width,height,null); 
    g.dispose(); 
    bs.show(); 
    } 


public static void main(String[] args){ 
Display_3d game = new Display_3d(); 
JFrame frame = new JFrame(); 
frame.add(game); 
frame.pack(); 
frame.setTitle(title); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setSize(width,height); 
frame.setLocationRelativeTo(null); 
frame.setResizable(false); 
frame.setVisible(true); 

System.out.println("Running..."); 

game.start(); 

} 
} 

wirft meine Klasse Render

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; 
    pixels = new int[width * height]; 
} 

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

    for (int x = 0; x<render.width; x++){ 
    int xPix = x + xOffset; 
    pixels[xPix + yPix * width] = render.pixels[x+y * render.width]; 

    } 
    } 
    } 
    public static void main (String[] args){} 
} 

My Screen Klasse

import java.util.Random; 
public class Screen extends Render{ 
private Render test; 

public Screen(int width, int height){ 
    super(width,height); 
    Random random = new Random(); 
    test = new Render(256,256); 

    for (int i = 0; i <256*256; i++){ 
    test.pixels[i] = random.nextInt(); 
    } 
    } 

    public void render() { 
    draw(test,0,0); 
    } 

    public static void main (String[] args){} 
} 

Antwort

1

In Sie coonstructor Sie lokale Variable erstellen

public Display_3d(){ 
    Screen screen = new Screen(width,height); //<------------- 
    img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
    pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData(); 
} 

Stattdessen t zuweisen o Bereich

public Display_3d(){ 
    this.screen = new Screen(width,height); //<------------- 
    img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
    pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData(); 
} 
+0

danke das hat mir sehr geholfen das Problem war nicht wo ich überhaupt dachte :) !!! –

0

Die folgende:

if (bs == null){ 
    this.createBufferStrategy(3); 

eine „Pufferstrategie“ schaffen, aber es wird den Wert von bs nicht beeinflussen, was null erwiesen gerade ist. Daher wird Ihr Versuch, bs weiter unten zu verwenden, garantiert fehlgeschlagen.

Verwandte Themen