[Java] Waar compileert ie niet?

Pagina: 1
Acties:

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
Ben bezig met het volgende spelletje onder java met Borland jbuilder. elke keer dat ik hem compile krijg ik volgende error :

java.lang.NullPointerException
at spel.Applet2.init(Applet2.java:20)

Weet iemand waar het aan kan liggen of wat ik moet veranderen om dit vervelend bericht weg te krijgen ? Source is als volgt :

====================
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
package spel;

import java.awt.*;
import java.applet.*;

public class Applet2 extends Applet
{
  private Achtergrond achtergrond;
  private Bal bal;
  private Mannetje man;
  private int steps=5, appBreedte, appHoogte;
  private Image afbeelding, ball, buffer;
  private Graphics gBuffer;

  public void init()
  {
    appBreedte=getSize().width;
    appHoogte=getSize().height;
    buffer=createImage(appBreedte,appHoogte);
    gBuffer=buffer.getGraphics();

    achtergrond = new Achtergrond( getGraphics(), gBuffer, appBreedte, appHoogte);
    requestFocus();
    afbeelding= getImage( getDocumentBase(),"mallow.gif");
    ball=getImage(getDocumentBase(),"ball.gif");
  }

  public void start()
  {
    if(bal==null)
    {
    //bal = new Bal(gBuffer, 10, ball, this);
    //bal.start();
    }
    if(man==null)
    {
    man = new Mannetje(50,150,20,20, afbeelding, this);
    man.start();
    }
  }

  public void stop()
  {
    if(bal!=null)
    {
    bal.stop();
    bal=null;
    }
    if(man!=null)
    {
    man.stop();
    man=null;
    }
  }

  public boolean keyDown(Event e, int key)
    {
    switch(key)
    {
      case Event.DOWN:  if(man.y()+man.lengte()<appHoogte || man.y()-man.lengte() > achtergrond.ygrens1())
                    man.sety(steps);
                  break;
      case Event.UP:    man.sety(-steps);
                  break;
      case Event.RIGHT:  man.setx(steps);
                  break;
      case Event.LEFT:   man.setx(-steps);
                  break;
    }
    return true;
    }

  public void paint(Graphics g)
  {
    achtergrond.teken();
    gBuffer.drawImage(afbeelding, 20, 20, 100, 100, this);
    man.teken();
    //bal.teken();
    g.drawImage(buffer, 0, 0, this);
  }

  public void update(Graphics g) {
    //achtergrond.teken();
//    man.teken();
    gBuffer.drawImage(afbeelding, 20, 20, 1, 1, this);
    paint(g);
  }

  public void destroy() {
    gBuffer.dispose();
  }
}

class Achtergrond
{
  private Graphics g, gBuffer;
  private int breedte, hoogte, xgrens1, xgrens2, ygrens1, ygrens2;

  public Achtergrond(Graphics g, Graphics gBuffer, int breedte, int hoogte)
  {
    this.g=g;
    this.gBuffer=gBuffer;
    this.breedte=breedte;
    this.hoogte=hoogte;
  }

  public int ygrens1() {
    ygrens1=hoogte-230+40;
    return ygrens1;
  }
  public void teken()
  {
    gBuffer.setColor(Color.blue);
    gBuffer.fillRect(0,0,breedte,150); // De Lucht
    gBuffer.setColor(Color.yellow);
    gBuffer.fillRect(0,hoogte-190,breedte,150); // Het zand
    gBuffer.setColor(Color.orange);
    gBuffer.fillRect(0,hoogte-230,breedte,40);
    gBuffer.fillRect(0,hoogte-40,breedte,40); // Rand
    gBuffer.setColor(Color.white);
    gBuffer.fillRect( (breedte/2)-5,hoogte-230,10,230); // Paal
  }
}

class Bal extends Thread
{
  private Graphics g;
  private double y, dy=1, x, dx=1;
  private int grootte;
  private Image ball;
  private Applet theApplet;

  public Bal(Graphics g, int grootte, Image ball, Applet theApplet)
  {
    this.g=g;
    this.grootte=grootte;
    this.ball=ball;
    this.theApplet=theApplet;
  }

  public void teken()
  {
    //g.drawImage(ball, (int)x, (int)Math.round(y), grootte, grootte, theApplet);
    g.drawImage(ball, 10, 10, 50, 50, theApplet);
  }

  public void run()
  {
    x=10;
    y=40;
    //sleep(1000);

    while (true)
    {
    x=x+dx;
    y=y+dy;
    if (y >= 300)
      dy--;
    //theApplet.repaint();
    }
  }
}

  class Mannetje extends Thread
  {
    private Graphics g, gBuffer;
    private int x, y, lengte, breedte;
    private Image afbeelding;
    Applet theApplet;

    public Mannetje(int x, int y, int breedte, int lengte, Image afbeelding, Applet theApplet)
    {
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void run()
    {
    while(true)
    {
        theApplet.repaint();
        sleep(10);
    }
    }

    public void teken()
    {
    gBuffer.drawImage(afbeelding, x, y, lengte, breedte, theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
NullPointerException betekent dat je een variabele wel hebt gemaakt, maar nog niet hebt geinitialiseerd. Met andere woorden : als je :
code:
1
Button knopOK;

doet en dan :
code:
1
knopOK.setText("blaat");

voordat je :
code:
1
knopOK = new Button();

doet dan geeft ie een fout omdat je nog geen knop hebt geconstrueerd :)

Zoek je code daarop es goed door. Ik zal ook ff kijken , maar je leert meer als je het zelf doet :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16:30

Janoz

Moderator Devschuur®

!litemod

Een exception tijdens het compileren??
haal je compileren en uitvoeren niet een beetje door de war?

Daarnaast is sourcecode leesbaarder waneer je het tussen [code] en [/code] zet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
Ok. Dat is wat duidelijker. Thanks :) Hij zegt dat de error in regel 20 zit (gBuffer=buffer.getGraphics();) maar deze buffer vul ik later in de code echt wel in (int paint() ). Wat kan ik anders doen zodat hij stopt met klagen?

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
Yeah. Dat bedoel ik. Bedankt voor de tip.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Beetje inspringen in je code is trouwens ook wat netter :)

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 07:53
[edit] was al gezegd :z

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Neej dat ging over de code tags :)
Maarja boeiiu }:O

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
Heb ergens anders gelezen dat Java dit niet pikt en dat ik addnotify moet overriden. Heb ik gedaan. Maar geeft nog steeds dezelfde error. Code ziet er nu als volgt uit :
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
package spel;

import java.awt.*;
import java.applet.*;

public class Applet2 extends Applet
{
  private Achtergrond achtergrond;
  private Bal bal;
  private Mannetje man;
  private int steps=5, appBreedte, appHoogte;
  private Image afbeelding, ball, buffer;
  private Graphics gBuffer;

  public void addNotify()
  {
    super.addNotify();
    appBreedte=getSize().width;
    appHoogte=getSize().height;
    buffer=createImage(600,400);
    //gBuffer=buffer.getGraphics();
  }

  public void init()
  {
    //buffer=createImage(appBreedte,appHoogte);
    gBuffer=buffer.getGraphics();

    achtergrond = new Achtergrond( getGraphics(), gBuffer, appBreedte, appHoogte);
    requestFocus();
    afbeelding= getImage( getDocumentBase(),"mallow.gif");
    ball=getImage(getDocumentBase(),"ball.gif");
  }

  public void start()
  {
    if(bal==null)
    {
    //bal = new Bal(gBuffer, 10, ball, this);
    //bal.start();
    }
    if(man==null)
    {
    man = new Mannetje(50,150,20,20, afbeelding, this);
    man.start();
    }
  }

  public void stop()
  {
    if(bal!=null)
    {
    bal.stop();
    bal=null;
    }
    if(man!=null)
    {
    man.stop();
    man=null;
    }
  }

  public boolean keyDown(Event e, int key)
    {
    switch(key)
    {
      case Event.DOWN:  //if(man.y()+man.lengte()<appHoogte || man.y()-man.lengte() > achtergrond.ygrens1())
                    man.sety(steps);
                  break;
      case Event.UP:    man.sety(-steps);
                  break;
      case Event.RIGHT:  man.setx(steps);
                  break;
      case Event.LEFT:   man.setx(-steps);
                  break;
    }
    return true;
    }

  public void paint(Graphics g)
  {
    achtergrond.teken();
    gBuffer.drawImage(afbeelding, 20, 20, 100, 100, this);
    man.teken();
    //bal.teken();
    g.drawImage(buffer, 0, 0, this);
  }

  public void update(Graphics g) {
    //achtergrond.teken();
//    man.teken();
    gBuffer.drawImage(afbeelding, 20, 20, 1, 1, this);
    paint(g);
  }

  public void destroy() {
    gBuffer.dispose();
  }
}

class Achtergrond
{
  private Graphics g, gBuffer;
  private int breedte, hoogte, xgrens1, xgrens2, ygrens1, ygrens2;

  public Achtergrond(Graphics g, Graphics gBuffer, int breedte, int hoogte)
  {
    this.g=g;
    this.gBuffer=gBuffer;
    this.breedte=breedte;
    this.hoogte=hoogte;
  }

  public int ygrens1() {
    ygrens1=hoogte-230+40;
    return ygrens1;
  }
  public void teken()
  {
    gBuffer.setColor(Color.blue);
    gBuffer.fillRect(0,0,breedte,150); // De Lucht
    gBuffer.setColor(Color.yellow);
    gBuffer.fillRect(0,hoogte-190,breedte,150); // Het zand
    gBuffer.setColor(Color.orange);
    gBuffer.fillRect(0,hoogte-230,breedte,40);
    gBuffer.fillRect(0,hoogte-40,breedte,40); // Rand
    gBuffer.setColor(Color.white);
    gBuffer.fillRect( (breedte/2)-5,hoogte-230,10,230); // Paal
  }
}

class Bal extends Thread
{
  private Graphics g;
  private double y, dy=1, x, dx=1;
  private int grootte;
  private Image ball;
  private Applet theApplet;

  public Bal(Graphics g, int grootte, Image ball, Applet theApplet)
  {
    this.g=g;
    this.grootte=grootte;
    this.ball=ball;
    this.theApplet=theApplet;
  }

  public void teken()
  {
    //g.drawImage(ball, (int)x, (int)Math.round(y), grootte, grootte, theApplet);
    g.drawImage(ball, 10, 10, 50, 50, theApplet);
  }

  public void run()
  {
    x=10;
    y=40;
    //sleep(1000);

    while (true)
    {
    x=x+dx;
    y=y+dy;
    if (y >= 300)
      dy--;
    //theApplet.repaint();
    }
  }
}

  class Mannetje extends Thread
  {
    private Graphics g, gBuffer;
    private int x, y, lengte, breedte;
    private Image afbeelding;
    Applet theApplet;

    public Mannetje(int x, int y, int breedte, int lengte, Image afbeelding, Applet theApplet)
    {
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void run()
    {
    while(true)
    {
        theApplet.repaint();
        sleep(10);
    }
    }

    public void teken()
    {
    gBuffer.drawImage(afbeelding, x, y, lengte, breedte, theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

Weet iemand waar dit aan kan liggen. Word er nu een beetje gek van |:(

Verwijderd

Ik zeg maar wat hoor, maarre moet je niet eerst voordat je
code:
1
buffer=createImage(600,400);

neeerzet, eerst
code:
1
buffer=new Image();

neerzetten? Ik weet het niet hoor, tis lang geleden dat ik iets met Java deed...

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Nee, dat hoeft niet. Je vangt met dat ding de return op...

Wat dus een instantie is van de juiste klasse.

Verwijderd

code:
1
gBuffer=buffer.getGraphics();

Genereert idd de NullPointerException. Dit komt omdat de variabele buffer in het vorige statement NIET geinitialiseerd is.
code:
1
createImage(appBreedte,appHoogte);

retourneert dus NULL. Ik denk dat je eens moet kijken naar de API-docs van die functie, om te kijken wanneer deze NULL retourneert.

edit:
Als je ff zegt in welke klasse createImage() zit, kan ik wat verder zoeken, ik weet het nl niet uit mijn hoofd

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
Weet het zelf ook niet. Heb geprobeerd om AddNotify te overriden :
code:
1
2
3
4
5
6
7
8
/*public void addNotify()
  {
    super.addNotify();
    //appBreedte=getSize().width;
    //appHoogte=getSize().height;
    buffer=createImage(appBreedte,appHoogte);
    //gBuffer=buffer.getGraphics();
  }*/

Maar dat werkte niet. Heb vele combinaties van uitgecomment code gebruikt. Ik moet het classes man in init initialiseren, dus zie geen manier om die nullpointer te omzeilen. Heb de code versimpeld. Het is nu als volgt:
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
88
89
90
91
92
93
94
95
96
package spel;

import java.awt.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Image speler1,buffer;
  //private Mannetje man;
  private Graphics gBuffer;

  public void init() {
    speler1=getImage( getDocumentBase(),"mallow.gif");
    //man = new Mannetje(gBuffer,speler1,50,150,20,20, this);
  }

  public void addNotify() {
    super.addNotify();
    initGraphics();
  }

  public void initGraphics()
  {
    buffer=createImage(400,300);
    gBuffer=buffer.getGraphics();
  }

  public boolean keyDown(Event e, int key) {
    switch(key) {
    case Event.DOWN:  man.sety(steps);
                break;
    case Event.UP:    man.sety(-steps);
                break;
    case Event.RIGHT: man.setx(steps);
                break;
    case Event.LEFT:  man.setx(-steps);
                break;
    }
    return true;
  }

  public void paint(Graphics g) {
    g.drawImage(speler1, 50, 150, 20, 20, this);
  }
}

class Mannetje implements Runnable {
  private Graphics g;
  private Image speler;
  int x, y, breedte, lengte;
  private Thread thread;
  private Applet theApplet;

  public Mannetje(Graphics g,Image speler, int x, int y, int breedte, int lengte, Applet theApplet) {
    this.g=g;
    this.speler=speler;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
  }

  public void start() {
    if (thread==null) {
    thread=new Thread(this);
    thread.start();
    }
  }

    public void run() {
    teken();
    while(true) {
      theApplet.repaint();
      sleep(10);
    }
    }

    public void stop() {
    if(thread !=null) {
      thread.stop();
      thread=null;
    }
    }

    public void teken()
    {
    //g.drawImage(speler, x, y, lengte, breedte, theApplet);
    g.setColor(Color.black);
    g.fillOval(100,50,40,40);
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }
  }

Hij doet het nog steeds niet :(. Weet iemand hier raad mee?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

dit viel me wel op.
code:
1
2
3
4
5
6
7
8
public Mannetje(Graphics g,Image speler, int x, int y, int breedte, int lengte, Applet theApplet) {
    this.g=g;
    this.speler=speler;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
  }

je vergeet theApplet in te stellen..

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

en waarom die je zo ingewikkeld met die thread?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AlarmThread extends Thread
{
  public AlarmThread()
  {
    ...constructor code
  }

  publiv void run()//deze override ik van thread
  {
     //en hier mooie thread code.
  }
}

//en starten met..
AlarmThread alarmThread = new Thread();
alarmThread.start();

[edit] heb de rest van je code even doorgekeken en daar zie ik staan dat je het eerst met een Thread had, dus dat zit wel snor. En die fout van theApplet in te stellen is er pas later ingekropen.

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 19:19
in the applet vul ik gewoon this in als ik het initialiseer. Dat is het probleem niet. Hij gaat klagen bij getGraphics().

Verwijderd

getsize geeft een double terug. Je zou dus eerst kunnen checken of de hoogte en breedte goed terug gegeven word na je getsize, voordat je een image gaat maken.

Verders moet je natuurlijk altijd!! checken of je buffer dus niet null is.
createImage
public Image createImage(int width,
int height)
Creates an off-screen drawable image to be used for double buffering.
Parameters:
width - the specified width.
height - the specified height.
Returns:
an off-screen drawable image, which can be used for double buffering.
Pagina: 1