AWT AWT-EventQueue-0 Null_Pointer_Exception durch Variable

ToastIt

Mitglied
Hey ich wollte "ein" Array bzw die hinterlegten Arraywerte in einem GUI erzeugen.

So funktioniert es wunderbar:
Java:
public void render(Graphics2D g) {
        int y = 0;
        int x = 0;
        for(int z = 0; z < image.getWidth(); z += game.JClonk.blocksize ) {
            for (x=0; x < image.getWidth(); x += game.JClonk.blocksize) {
                block[x][0].render(g);
                block[x][5].render(g);
                block[x][10].render(g);
            }
            y += game.JClonk.blocksize;
            if((y < image.getHeight())) {
                   z = 0;  
            } else {
                    z = image.getWidth();
            }
        }
    }
// game.JClonk.blocksize = 5;
aber mit block[x][y].render(g); - wirft er mir diesen Fehlercode:

Was übersehe ich bei meiner y Variable?

Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at world.World.render(World.java:30)
    at game.Playstate.render(Playstate.java:26)
    at game.GameStateManager.render(GameStateManager.java:22)
    at game.Game.paintComponent(Game.java:56)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1200(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Das Script sollte im Endeffekt die blocks erzeugen in dem es erst das X immer wieder erhöht, anschließend einmal Y erhöht um dann wieder von vorn zu beginnen solange nicht das komplette Bild abgearbeitet ist(was dann über z realisiert wird/werden sollte).
 
Zeile 30 ist in dem Fall das Block Arrayblock[x][y].render(g);

und wenn ich mir x sowie y anzeigen lasse (in der for schleife)sieht alles gut aus.
z.b.
x: 5, 10, 15, 20
y: 0
x: 5, 10, 15, 20
y: 5
 
Die Frage ist nicht, was x und y für einen Wert haben, sondern ArrayBlock[x][y]
Du suchst also eine Ebene zu tief.
 
Wo befüllst du denn das Array?
hier mal das ganze Script der Klasse
Java:
package world;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;

import game.Block;
import game.Material;

public class World {
    private Block[][] block; //vorher feste Range vergeben?! eher suboptimal
    private BufferedImage image;
   
    public World() {
        loadWorld();
    }
   
    public void render(Graphics2D g) {   // erstelle Blöcke auf GUI
        int y = 0;
        int x = 0;
        while(x < image.getWidth()) {
            for (x=0; x < image.getWidth(); x += game.JClonk.blocksize) {
                block[x][y].render(g);
            }
            y += game.JClonk.blocksize;
           
            if((x >= image.getWidth()) && (y < image.getHeight())) {
                x = 0;   
            } else {
                x = image.getWidth();
            }
        }
    }
    public void loadWorld() { // Lade Image und wandel Farbe in Block um
        try {
            image = ImageIO.read(new File("res/landscape2.png"));
            int x = 0;
            int y = 0;
            while(x < image.getWidth()) {
                for (x=0; x <= image.getWidth(); x += game.JClonk.blocksize) {
                   
                    if((new Color(image.getRGB(x, y)).toString()).equals(new Color(127,127,127).toString())) {
                        block[x][y] = new Block(Material.values()[1], x, y, game.JClonk.blocksize, game.JClonk.blocksize);
                       
                    } else if((new Color(image.getRGB(x, y)).toString()).equals(new Color(0,162,232).toString())) {
                        //block[x][y] = new Block(Material.values()[0], x, y, game.JClonk.blocksize, game.JClonk.blocksize);

                    } else if((new Color(image.getRGB(x, y)).toString()).equals(new Color(0,200,0).toString())) {
                        //block[x][y] = new Block(Material.values()[2], x, y, game.JClonk.blocksize, game.JClonk.blocksize);
                    }
                }
                y += game.JClonk.blocksize;
               
                if((x >= image.getWidth()) && (y < image.getHeight())) {
                    x = 0;   
                } else {
                    x = image.getWidth();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Ich könnte das auch ohne Arrays realisieren aber ich denke mit wäre schon sinnvoller ^^.
"new Block(Material.values()[0], x, y, game.JClonk.blocksize, game.JClonk.blocksize);" funktioniert erstmal grundsaätzlich ohne Probleme und erzeugt mir genug Blöcke 😉
 
Hab zwar noch eine andere Frage aber die stell ich gleich mit hier. Ich kann nun Grafiken bestimmter Größe benutzen. Wenn ich sie überschreite folgt ein "java.lang.ArrayIndexOutOfBoundsException:1000" --> Array erhöhen --> "Coordinate out of bounds!", nehme an dass das Array seine Grenzen hat.

Nun könnte ich statt 1Block direkt mehrere erstellen lassen, um trotz kleinem Bild eine größere Map zu erstellen. Oder ich splitte die Grafik(halte ich für keine gute Idee) oder ich ändere mein Array ab?!.

Was würdet ihr tun? Möchte nicht erst den falschen Weg einschlagen.
 
Das Array ist eben genau so groß, wie du es ihm sagst. Daher solltest du es eben immer so groß erstellen wie nötig.
Ansonsten ist eigentlich deiner ganzer Ansatz eher schlecht gewählt. Du scheinst ein Spiel programmieren zu wollen und willst dafür swing/awt verwenden...schlechte Idee.
Grundsätzlich würde ich dir erstmal empfehlen dich grundsätzlich mehr mit Java zu befassen, bevor du versuchst ein Spiel zu programmieren. Ansonsten solltest du eben erst gar nicht versuchen das ganze mit Swing zu erstellen, sondern eben mit einem passenden Framework. Für Java bietet sich beispielsweise LibGDX an
 
Danke schonmal 🙂,

Ja ich will ein kleines Game programmieren um Java besser zu verstehen und mir bringt es nichts stupide Java-Tutorials an zuwenden wenn ich dahinter kein Ziel sehe. Deswegen das Spiel. Um zu sehen wie weit ich komme, wo ich festhäng und was ich noch nicht begriffen hab. LibGDX? Kannte ich noch nicht, ist aber sicherlich sinnvoll, mächtig und hilfreich. Aber ist es sinnvoll für das erlernen von Java? Ich will auch das Rad nicht neu erfinden aber ich möchte halt gerne das gesamte Grundprinzip/-konzept verstehen(Methoden etc.) weshalb ich auch bis jetzt keine anderen game-engines/-libs verwende. Zudem muss man ja irgendwo anfangen^^, und mehrere Youtube-Tuts haben mich auch in die Richtung zu swing geschickt. Klar wenn ihr sagt, dass ich bei meinem 2D Game dann iwann an meine bzw. an javas Grenze komme macht dies auch keinen Sinn mehr und lasse mich gerne eines besseren belehren. 😉
 
Problem ist halt auch das viele (die meisten?) YouTube Tutorials ziemlich mist sind. Oft ist es eben so das Leute die selbst kaum Ahnung haben meinen sie wären so gut das sie Tutorials machen können. Und daher findet man eben auch viel mist auf YouTube.
Um die Grundlagen von Java zu lernen kann man ruhig ein Spiel machen, aber dann besser eines ohne viel Grafik. Beispielsweise Textadventure oder irgendwelche Manager Spiele.
 

Zurück
Oben