Toon posts:

[JAVA] NullPointerException bij animatie / Graphics gebruik

Pagina: 1
Acties:
  • 39 views sinds 30-01-2008

Verwijderd

Topicstarter
Hallo,

ik moet voor een project een applicatie maken waarin animaties zitten.
Ik heb daarom eerst een applet gemaakt waarin de thread / animatie ook goed werkt.

maar als ik nu dezelfde thread met wat aanpassingen in een applicatie wil neerzetten, dan krijg ik een error die ik niet kan achterhalen. Weet iemand misschien wat hier precies fout aan is?

Ik heb dus een applicatie...

ps1: de package klopt gewoon, ondanks de rare naam ;)
ps2: applicatie is gewoon een test applicatie, de uiteindelijk applicatie is veel uitgebreider

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
package myprojects.bolletje;

import java.awt.*;
import java.awt.event.*;

public class PostbodeTest extends Frame
{
    PostbodeAnimatie postbode;
    
    public PostbodeTest()
    {
        postbode = new PostbodeAnimatie();
        setSize(400,400);
        setTitle("Testen");
        setVisible(true);
        postbode.start();
    }
    
    public static void main(String[] args) {
    new PostbodeTest(); 
    }
    
    public void paint(Graphics g)
    {   
        
    }

    public void start() {
            
        if(postbode==null) {
            if(getGraphics()!=null) {
                postbode=new PostbodeAnimatie();
                postbode.start();
                System.out.println("Gestart...");
            }
        }
    }
}


En dit is de thread die ik probeer te draaien in bovenstaande applicatie;

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package myprojects.bolletje;

import java.awt.event.*;
import java.awt.*;

    class PostbodeAnimatie extends Thread implements Runnable {
        private Graphics g;
        private ImageObserver f;
        Image frame;
        private int x=300;      
        private boolean doorgaanPostbode;
        final int LINKS=2,ACTIE=3,RECHTS=2; 
        private Image[] postLinks,postActie, postRechts;
        
        
        public PostbodeAnimatie() {
            
            this.g=g;
            this.f=f;
            this.x=x;
            
            postLinks=new Image[LINKS];
            postActie=new Image[ACTIE];
            postRechts=new Image[RECHTS];
        
            for(int i=0;i<LINKS;i++) {
                postLinks[i]=Toolkit.getDefaultToolkit().getImage("postLinks"+i+".gif");
                System.out.println("Image LINKS "+i+" geladen");
            }
            
            for(int i=0;i<ACTIE;i++) {
                postActie[i]=Toolkit.getDefaultToolkit().getImage("postActie"+i+".gif");
                System.out.println("Image ACTIE "+i+" geladen");
            }
            
            for(int i=0;i<RECHTS;i++) {
                postRechts[i]=Toolkit.getDefaultToolkit().getImage("postRechts"+i+".gif");
                System.out.println("Image RECHTS "+i+" geladen");
            }
            
            doorgaanPostbode=true;
        }
                    
        public void run() {
            System.out.println("PostbodeAnimatie Alive");
            while(true) {
                while(doorgaanPostbode) {
                    System.out.println("PostbodeAnimatie Active");
                    for(int i=0;i<3;i++) {
                        tekenPostbode(g,postLinks[0],-50);
                        tekenPostbode(g,postLinks[1],-50);
                    }
                    for(int i=0;i<ACTIE;i++) {
                        tekenPostbode(g,postActie[i],0);
                    }
                    for(int i=0;i<3;i++) {
                        tekenPostbode(g,postRechts[0],50);
                        tekenPostbode(g,postRechts[1],50);
                    }
                }
            }
        }
        
        public void tekenPostbode(Graphics g, Image frame, int stap) {
            this.g = g;
            x+=stap;
            System.out.println("//TEKENPOSTBODE @ "+x+" met stap @ "+stap);
            teken(g, frame);    
            System.out.println("hallow");       
            slaap(250);
        }
        
        public void teken(Graphics g, Image frame)
        {
            g.drawImage(frame,x,50,f);
        }           
            
        public void nuStoppen() {
            doorgaanPostbode=false;
        }
        
        private void slaap(int millisec) {
            try {
                Thread.sleep(millisec);
            } catch(InterruptedException e) {}
        }
    }


In het achterliggende DOS venster krijg ik het volgende te zien:
Image LINKS 0 geladen
Image LINKS 1 geladen
Image ACTIE 0 geladen
Image ACTIE 1 geladen
Image ACTIE 2 geladen
Image RECHTS 0 geladen
Image RECHTS 1 geladen
PostbodeAnimatie Alive
PostbodeAnimatie Active
//TEKENPOSTBODE @ 250 met stap @ -50
java.lang.NullPointerException
at myprojects.bolletje.PostbodeAnimatie.teken(PostbodeAnimatie.java:76)
at myprojects.bolletje.PostbodeAnimatie.tekenPostbode(PostbodeAnimatie.j
ava:69)
at myprojects.bolletje.PostbodeAnimatie.run(PostbodeAnimatie.java:51)
Het gaat dus fout bij de methode 'teken' in de thread.
1 of andere Nullpointer, terwijl het compilen verder goed gaat en alle variabelen gedeclareerd zijn.

We zijn er gister al de hele dag mee bezig geweest, allemaal verschillende dingen te proberen. Maar het lukt gewoon niet. Iemand hier die misschien het probleem ziet of een alternatieve oplossing weet :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Je hebt dus een variabele die je aanspreekt, maar waarvoor je geen geheugen gealloceerd hebt.
Ik denk dat je gewoon best eens je applicatie debugged (stap voor stap erdoor lopen dus), en dan nagaan voor welke variabele je geen geheugen gealloceerd hebt.
Als je programma compiled, wil dat zeggen dat er geen syntax errors in zitten. De compiler kan echter niet altijd weten of je wel geheugen gealloceerd hebt voor een variabele.

[ Voor 27% gewijzigd door whoami op 11-12-2003 12:03 ]

https://fgheysels.github.io/


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
g is null

Deze code is leuk en aardig:
code:
1
this.g = g;

maar doet in feite niks. En aangezien g al geinitialiseerd is op null, is en blijft g null.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Java:
1
2
3
4
5
        public PostbodeAnimatie() {
            
            this.g=g;
            this.f=f;
            this.x=x;

Kun jij me vertellen wat hij hier doet? Hij zal hier gewoon de huidige g (==null) in g zetten 8)7. Je moet dus die Graphics zien door te geven aan je Runnable implementatie bijv als parameter in de constructor.

2 dingen:
• Omdat je Runnable implementatie geen component is, kan hij geen getgraphics(omdat hij die niet heeft!) doen en is eigenlijk ook niet als zodanig bekend als 'tekent zichzelf'. Misschien kun je er een GUI component van maken, of het tekenen op een component
• Thread implementeert al Runnable

Verwijderd

Topicstarter
whoami schreef op 11 december 2003 @ 12:02:
Je hebt dus een variabele die je aanspreekt, maar waarvoor je geen geheugen gealloceerd hebt.
Ik denk dat je gewoon best eens je applicatie debugged (stap voor stap erdoor lopen dus), en dan nagaan voor welke variabele je geen geheugen gealloceerd hebt.
Als je programma compiled, wil dat zeggen dat er geen syntax errors in zitten. De compiler kan echter niet altijd weten of je wel geheugen gealloceerd hebt voor een variabele.
Wat bedoel je precies met 'geheugen alloceren'?

Ik denk zelf dus initialisatie/declaratie?

De errors verschijnen in regel 76, 69, 51
ik gebruik daar dus g (Graphics), f (ImageObserver), frame (Image) of x (int).

Terwijl er duidelijk het volgende wordt aangemaakt:

private Graphics g; <-- niet nodig om verder nog aan te maken met bijvoorbeeld new
private ImageObserver f; <-- zelfde als bovenstaande
Image frame; <-- wordt aangegeven als postLinks[0] welke weer postLinks0.gif is
private int x=300; <-- is 300, dus zeker niet null

Ik heb dus zoals je al zei alles zitten nalopen, meerdere keren zelfs
ik ben verder geen pro ofzo, maar ik zie hier niets wat null zou kunnen zijn (das toch het geval met een nullpointer?)

-edit

Oops, 2 nieuwe reacties tijdens het tikken van mijn post
Ff die reacties doornemen :)

[ Voor 6% gewijzigd door Verwijderd op 11-12-2003 12:11 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
.
edit:

Deze post is na de edit van TS wat overbodig geworden

[ Voor 67% gewijzigd door Dash2in1 op 11-12-2003 12:12 ]


Verwijderd

Topicstarter
bedankt voor de reacties, zal even wachten op mede student om te kijken of we het kunnen oplossen ;)

[ Voor 4% gewijzigd door Verwijderd op 11-12-2003 12:12 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mja, en in feite is dit dus gewoon een kwestie van debuggen, wat wij niet voor je gaan doen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1

Dit topic is gesloten.