Toon posts:

[Java] NullPointerException

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een beetje aan het proberen om een simple snake spelletje te maken, maar loop nu al vrij snel vast. Ik krijg steeds een NullPointerException, maar alles wat ik aanroep werkt wel normaal. Dit is de source code die ik tot nu toe heb gemaakt.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Color;

public class Snake
       extends JFrame
{
        private int snakeX [  ]; // << Deze heb ik toegevoegd
        private int snakeY [  ]; // ^^
        private Graphics graphics;
        private Image image;

        public static void main ( String [  ] arguments )
        {
                new Snake (  );
        }

        private Snake (  )
        {
                setDefaultCloseOperation ( EXIT_ON_CLOSE );
                setLocation ( 250, 250 );
                setSize ( 400, 400 );
                setVisible ( true );

                image = createImage ( 100, 100 );

                graphics = image.getGraphics (  );

                repaint (  );
        }

        public void paint ( Graphics graphics )
        {
                this.graphics.setColor ( Color.BLACK );
                this.graphics.fillRect ( 0, 0, 100, 100 );

                graphics.drawImage ( image, 0, 0, this );
        }
}


En dit is de foutmelding:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java.lang.NullPointerException
 at Snake.paint(Snake.java:35)
 at sun.awt.RepaintArea.paint(RepaintArea.java:177)
 at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:260)
 at java.awt.Component.dispatchEventImpl(Component.java:3677)
 at java.awt.Container.dispatchEventImpl(Container.java:1627)
 at java.awt.Window.dispatchEventImpl(Window.java:1606)
 at java.awt.Component.dispatchEvent(Component.java:3476)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

 at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)


Het is vast iets heel stoms, maar ik kan het niet vinden. Sorry voor de layout f*ck up.

/edit ff aangepast, nu klopt ie wel

[ Voor 4% gewijzigd door Verwijderd op 26-04-2003 14:50 ]


  • jkf
  • Registratie: Oktober 2000
  • Laatst online: 21-06-2025

jkf

Lijkt me sterk, ik heb nog niet vaak gezien dat een NPE wordt gegeven op een regel zonder code.
Weet je zeker dat dit de exacte code is (inclusief commentaar etc) als gebruikt toen de fout optrad?

Hier runt deze overigens

[ Voor 7% gewijzigd door jkf op 26-04-2003 14:42 ]

P II 233 @ begane grond, rip (1997-2007), vervangen door vituele server uptime,


Verwijderd

Topicstarter
Hmm, als deze source bij jou wel werkt dan moet ik zeker mijn SDK ff controleren?

  • jkf
  • Registratie: Oktober 2000
  • Laatst online: 21-06-2025

jkf

Na je edit heb ik hier ook een nullpointerexception. FF kijken wat je hebt veranderd.

De verandering is dat je 2 int[] hebt gecreerd. Dit lijkt volledig ongerelateerd en is dus waarschijnlijk een multithreading probleem.
De eerste keer wordt de paint aangeroepen terwijl de ctructor nog niet volledig zichtbaar is uitgevoerd. (De paint wordt getriggerd door setVisible, maar in een andere thread uitgevoerd.)

De volgende code werkt wel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Color;

public class Snake
       extends JFrame
{
    private int snakeX [  ];
    private int snakeY [  ];
    private Graphics graphics;
    private Image image;

    public static void main ( String [  ] arguments )
    {
        new Snake (  );
    }

    private Snake (  )
    {
        synchronized (this) {
            setDefaultCloseOperation ( EXIT_ON_CLOSE );
            setLocation ( 250, 250 );
            setSize ( 400, 400 );
            setVisible ( true );

            image = createImage ( 100, 100 );

            graphics = image.getGraphics (  );

            repaint (  );
        }
    }

    public synchronized void paint ( Graphics graphics )
    {
        this.graphics.setColor ( Color.BLACK );
        this.graphics.fillRect ( 0, 0, 100, 100 );

        graphics.drawImage ( image, 0, 0, this );
    }
}


Mooier is overigens gewoon te checken of graphics niet null is in de paint method en daar de graphics eventueel in aan te maken indien nodig. Bovendien waarom gebruik je this voor de member variablen?

[ Voor 130% gewijzigd door jkf op 26-04-2003 15:01 ]

P II 233 @ begane grond, rip (1997-2007), vervangen door vituele server uptime,


Verwijderd

Topicstarter
En wat zou de oplossing dan zijn? Een thread aanmaken voor this?

Ah ik snap wat je bedoelt. Thanks.

[ Voor 36% gewijzigd door Verwijderd op 26-04-2003 15:00 ]


Verwijderd

Topicstarter
Dat this is alleen maar omdat ik nog ff dezelfde namen had voor de Graphics variabelen. En die if in de paint method is ook geen slecht idee :).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
jkf schreef op 26 April 2003 @ 14:48:
Mooier is overigens gewoon te checken of graphics niet null is in de paint method en daar de graphics eventueel in aan te maken indien nodig.
Wat een onzin: als je die graphics eenmal geinitialiseerd hebt, moet 'ie het gewoon blijven doen. Elke keer dat je gaat tekenen checken slaat conceptueel al nergens op (waarom zou 'ie opeens null worden?) en initialiseren in de paint-methode al helemaal niet. Initialisatie hoort vanuit de constructor plaats te vinden en nergens anders.

[ Voor 56% gewijzigd door Soultaker op 26-04-2003 15:07 ]

Pagina: 1