This site requires JavaScript, please enable it in your browser!
Greenfoot back
Tommy99
Tommy99 wrote ...

2015/2/22

Null Pointer Exception Error

Tommy99 Tommy99

2015/2/22

#
Hello. I am almost finished this game, but there is a mistake relating to the "Null Pointer Exception Error". I want the food to disappear when the turtle touches it, but the program just stops running and this shows up: java.lang.NullPointerException at Turtle.moreScore(Turtle.java:188) at Turtle.intersectingObjects(Turtle.java:156) at Turtle.act(Turtle.java:46) at greenfoot.core.Simulation.actActor(Simulation.java:594) at greenfoot.core.Simulation.runOneLoop(Simulation.java:552) at greenfoot.core.Simulation.runContent(Simulation.java:215) at greenfoot.core.Simulation.run(Simulation.java:205) Here is the code for the Turtle class:
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
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
 
public class Turtle extends Actor
{
    protected final int NORTH = 270;
    protected final int EAST = 0;
    protected final int SOUTH = 90;
    protected final int WEST = 180;
    private int SPEED = 2;
    private boolean firing=false;
    private Scoreboard myScore;
 
    private Scoreboard myLives;
    protected final static int OFFSET = 23;
    private int absY=736-2*OFFSET;
    private int dy=0;
    private int value = 1;
     
     
    //make a dy and an absdy integer and when dy = absdy make canmove=false
 
    public Turtle(Scoreboard score, Scoreboard lives)
    {
        super();
         
        getImage().scale(46,46);
        myScore = score;
 
        myLives = lives;
        setRotation(SOUTH);
    }
     
    public void explode()
    {
  
        Greenfoot.playSound("Explosion.wav");
    }   
 
    public void act()
    {
         
        checkKeys();
        nearEdge();
        isFacingWall();
        isFacingEdge();
        intersectingObjects();
         
         
 
         
    }   
     
     
     
    public boolean isMovingSouth()
    {
        if(Greenfoot.isKeyDown("down")==true)
        {
            return true;
        } else {
            return false;
        }
    }
 
    public void nearEdge()
    {
        MyWorld lol = (MyWorld)getWorld();
 
        if(getRotation()==SOUTH && getY()==getWorld().getHeight()-OFFSET && isMovingSouth()==true && isFacingWall()==false && dy<absY){
            lol.moveBackground(0, value);
            dy=dy+1;
        }
    }
 
    public void checkKeys()
    {
         
 
        if(Greenfoot.isKeyDown("up")){
            setRotation(NORTH);
            if(canMove()==true){
                move(SPEED);
                dy=dy-SPEED;
            }
        }
        if(Greenfoot.isKeyDown("down")){
            setRotation(SOUTH);
            if(canMove()==true){
                move(SPEED);
                dy=dy+SPEED;
            }
        }
        if(Greenfoot.isKeyDown("left")){
            setRotation(WEST);
            if(canMove()==true){
                move(SPEED);
            }
        }
        if(Greenfoot.isKeyDown("right")){
            setRotation(EAST);
            if(canMove()==true){
                move(SPEED);
            }
        }
        if(getRotation()==SOUTH){
            if(Greenfoot.isKeyDown("space")){
                if( firing==false){
 
                    getWorld().addObject(new Bullet(), getX(), getY()); 
 
                    Greenfoot.playSound("EnergyGun.wav");
                    firing=true;
                }
            }
            if(!Greenfoot.isKeyDown("space")){
                firing=false;
            }
 
        }
    }
 
 
    public Scoreboard getScoreboard()
    {
        return myScore;
 
    }
 
    public Scoreboard getScoreboard2()
    {
        return myLives;
    }
 
    public void intersectingObjects()
    {
 
        Actor ra = getOneIntersectingObject(RedApple.class);
        if(ra!=null){
            moreScore();
            getWorld().removeObject(ra);
        }
        Actor ga = getOneIntersectingObject(GreenApple.class);
        if(ga!=null){
            moreScore();
            getWorld().removeObject(ga);
 
        }
        Actor ba = getOneIntersectingObject(Bananas.class);
        if(ba!=null){
            moreScore();
            getWorld().removeObject(ba);
 
        }
        Actor br = getOneIntersectingObject(Bread.class);
        if(br!=null){
            moreScore();
            getWorld().removeObject(br);
 
        }
        Actor sn = getOneIntersectingObject(Snake.class);
        if(sn!=null){
            lessLives();
            getWorld().removeObject(sn);
 
        }
        Actor pe = getOneIntersectingObject(Pelican.class);
        if(pe!=null){
            lessLives();
            getWorld().removeObject(pe);
 
        }
         
 
    }
 
    public void lessLives()
    {
        myLives.changeScore(-1);
        if(myLives.getScore()==0){
            getWorld().addObject(new YouLose(), getWorld().getWidth()/2, getWorld().getHeight()/2);
            Greenfoot.stop();
 
        }
    }
 
    public void moreScore()
    {
        myScore.changeScore(50);
        if(myScore.getScore()==200){
            getWorld().addObject(new YouWin(), getWorld().getWidth()/2, getWorld().getHeight()/2);
            Greenfoot.stop();
        }
 
    }
 
     
 
     
    public boolean isFacingWall()
    {
        int xOffset=0, yOffset=0;
 
        switch(getRotation()){
            case EAST: xOffset=OFFSET; break;
            case SOUTH: yOffset=OFFSET; break;
            case WEST: xOffset=-OFFSET; break;
            case NORTH: yOffset=-OFFSET; break;
        }
 
        return getOneObjectAtOffset(xOffset, yOffset, ScrollingActor.class)!=null;
 
    }
 
    public boolean isFacingEdge()
    {
        switch(getRotation()){
            case EAST: return getX()>=getWorld().getWidth()-OFFSET;
            case SOUTH: return getY()>=getWorld().getHeight()-OFFSET;
            case WEST: return getX()<=OFFSET;
            case NORTH: return getY()<=OFFSET;
        }
        return false;
    }
 
    public boolean canMove()
    {
        return !(isFacingWall() || isFacingEdge());
    }
 
}
Any help would be appreciated. Thank you.
davmac davmac

2015/2/22

#
The exception occurs on line 188, which is this one:
1
myScore.changeScore(50);
So, 'myScore' must be null. The only way for that to happen would be if the constructor was called with null as the value for the score parameter.
Tommy99 Tommy99

2015/2/22

#
Oh, okay, thanks. Well, here's the code of my World class, where I made the score equal to 0. Isn't that how I would make it start at 0 though?
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
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
public class MyWorld extends World
{
    private Scoreboard score, lives;
     
    private String background1 =
 
        "HOOOGGOGOR"+
        "OOROORGOOT"+
        "ROOATOOGTO"+
        "OOOGOOOTGT"+
        "TROOOTGOOG"+
        "OOGOGRTOOR"+
        "RPTOBTRGOO"+
        "GOOOOOROTR"+
        "GGOOTOOROO"+
        "GROOOTTORG"+
        "GOCOOGOOTO"+
        "OTROOTGORG"+
        "ROOOGORROO"+
        "OGOROOTTRG"+
        "OOOOOTODRG"+
        "OROOGOOTOR";
 
    public MyWorld()
    {   
 
        super(460, 460, 1, false);
        buildWorld(background1);
        score = new Scoreboard("Score", 0);
        addObject(score, 200,50);
        lives = new Scoreboard("Lives", 3);
        addObject(lives, 410, 50);
 
 
    }
 
    private void buildWorld(String background1)
    {
 
        int x=23;
        int y=23;
        int counter = 0;
        for(int p=0; p<background1.length(); p++){
            if(background1.charAt(p)=='R'){
                addObject(new Rock(), x, y);
            }
            if(background1.charAt(p)=='G'){
                addObject(new Grass(), x, y);
            }
            if(background1.charAt(p)=='T'){
                addObject(new Tree(), x, y);
            }
            if(background1.charAt(p)=='A'){
                addObject(new RedApple(), x, y);
            }
            if(background1.charAt(p)=='B'){
                addObject(new Bread(), x, y);
            }
            if(background1.charAt(p)=='C'){
                addObject(new Bananas(), x, y);
            }
            if(background1.charAt(p)=='D'){
                addObject(new GreenApple(), x, y);
            }
            if(background1.charAt(p)=='S'){
                addObject(new Snake(), x, y);
            }
            if(background1.charAt(p)=='P'){
                addObject(new Pelican(), x, y);
            }
             
             
             
             
            if(background1.charAt(p)=='H'){
                addObject(new Turtle(score, lives), x, y);
            }
 
            x=x+46;
            counter++;
            if(counter==10){
                y+=46;
                x=23;
                counter=0;
            }
        }
 
 
    }
 
    public void moveBackground(int dx, int dy)
    {
        List<ScrollingActor> actors = getObjects(ScrollingActor.class);
        for(ScrollingActor actor:actors){
            actor.makeMove(-dx, -dy);
        }
    }
 
     
 
     
     
     
 
     
     
}
Tommy99 Tommy99

2015/2/22

#
And the scoreboard class, if this helps.
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 greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Color;
import java.awt.Font;
 
public class Scoreboard extends Actor
{
   //Properties ...
   private int score;
   private String text;
    public void act()
    {
         
    }   
    public Scoreboard(String label, int startingScore)
    {
        GreenfootImage img = new GreenfootImage(300,40);
        img.setColor(Color.BLUE);
        Font f=new Font("Comic Sans MS",Font.BOLD,24);
        img.setFont(f);
        img.drawString(label + ": " + startingScore, 5, 35);
        setImage(img);
        text=label;
        score=startingScore;
    }
     
    public void changeScore(int howMuch)
    {
        score = score + howMuch;
        GreenfootImage img = getImage();
        img.clear();
        img.drawString(text + ": " + score, 5, 35);
         
    }
    public int getScore()
    {
        return score;
    }
     
    
}
danpost danpost

2015/2/23

#
You are calling 'buildWorld' in your World subclass constructor, which adds the Turtle object into the world, BEFORE you create the Scoreboard object that is assigned to the 'score' field.
davmac davmac

2015/2/23

#
Right, so in your world constructor you have:
1
2
3
4
5
6
7
public MyWorld()
{  
 
    super(460, 460, 1, false);
    buildWorld(background1);
    score = new Scoreboard("Score", 0);
    ... (more)
Note that you call 'buildWorld' before you set score to anything. So during execution of the buildWorld method, score is null. One line of that method (line 78) creates a new turtle:
1
addObject(new Turtle(score, lives), x, y);
So, it's creating a turtle whose 'myScore' becomes null. I think you just need to initialise score before you call buildWorld, i.e. swap lines 30 and 31 in your MyWorld class.
Tommy99 Tommy99

2015/2/23

#
Oh, okay. It worked perfectly! Thank you both very much!
You need to login to post a reply.