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

2019/11/26

Exercise 9.70 add asteroids using generic type list<>

dROS dROS

2019/11/26

#
Everything works fine until i die and it shows me error. how do i fix this error; " am i a using generic list<> correctly or not to get remaining Asteroid object in background. code is between line 131-141 in rocket class
1
2
3
4
5
6
7
java.lang.NullPointerException
    at Rocket.leftObject(Rocket.java:136)
    at Rocket.act(Rocket.java:46)
    at greenfoot.core.Simulation.actActor(Simulation.java:567)
    at greenfoot.core.Simulation.runOneLoop(Simulation.java:530)
    at greenfoot.core.Simulation.runContent(Simulation.java:193)
    at greenfoot.core.Simulation.run(Simulation.java:183)
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
//Rocket class
import greenfoot.*;
import java.util.List;
 
/**
 * A rocket that can be controlled by the arrowkeys: up, left, right.
 * The gun is fired by hitting the 'space' key. 'z' releases a proton wave.
 *
 * @author Poul Henriksen
 * @author Michael Kölling
 *
 * @version 1.0
 */
public class Rocket extends SmoothMover
{
    private static final int gunReloadTime = 5;         // The minimum delay between firing the gun.
    private static final int protonReloadTime = 500;    // The minimum delay between proton wave bursts.
 
    private int reloadDelayCount;               // How long ago we fired the gun the last time.
    private int protonDelayCount;               // How long ago we fired the proton wave the last time.
    private int count=0;
    private GreenfootImage rocket = new GreenfootImage("rocket.png");   
    private GreenfootImage rocketWithThrust = new GreenfootImage("rocketWithThrust.png");
 
    /**
     * Initialise this rocket.
     */
    public Rocket()
    {
        reloadDelayCount = 5;
        protonDelayCount = 500;
        addToVelocity(new Vector(13, 0.7));    // initially slowly drifting
    }
 
    /**
     * Do what a rocket's gotta do. (Which is: mostly flying about, and turning,
     * accelerating and shooting when the right keys are pressed.)
     */
    public void act()
    {
        move();
        checkKeys();
        checkCollision();
        reloadDelayCount++;
        protonDelayCount++;
        leftObject();
    }
     
    /**
     * Check whether there are any key pressed and react to them.
     */
    private void checkKeys()
    {
        ignite(Greenfoot.isKeyDown("up"));
         
        if (Greenfoot.isKeyDown("left"))
        {
            turn(-5);
        }
        if (Greenfoot.isKeyDown("right"))
        {
            turn(5);
        }
        if (Greenfoot.isKeyDown("space"))
        {
            fire();
        }
        if (Greenfoot.isKeyDown("z"))
        {
            startProtonWave();
        }
    }
     
    /**
     * Check whether we are colliding with an asteroid.
     */
    private void checkCollision()
    {
        Asteroid a = (Asteroid) getOneIntersectingObject(Asteroid.class);
        if (a != null)
        {
            Space space = (Space) getWorld();
            space.addObject(new Explosion(), getX(), getY());
            space.removeObject(this);
            space.gameOver();
        }
    }
     
    /**
     * Should the rocket be ignited?
     */
    private void ignite(boolean boosterOn)
    {
        if (boosterOn)
        {
            setImage(rocketWithThrust);
            addToVelocity(new Vector(getRotation(), 0.3));
        }
        else
        {
            setImage(rocket);       
        }
    }
     
    /**
     * Fire a bullet if the gun is ready.
     */
    private void fire()
    {
        if (reloadDelayCount >= gunReloadTime)
        {
            Bullet bullet = new Bullet (getVelocity(), getRotation());
            getWorld().addObject (bullet, getX(), getY());
            bullet.move ();
            reloadDelayCount = 0;
        }
    }
     
    /**
     * Release a proton wave (if it is loaded).
     */
    private void startProtonWave()
    {
        if (protonDelayCount >= protonReloadTime)
        {
            ProtonWave wave = new ProtonWave();
            getWorld().addObject (wave, getX(), getY());
            protonDelayCount = 0;
        }
    }
private void leftObject(){
     
    
        Space space =(Space)getWorld();
      World world =getWorld();
      List<Asteroid> left =world.getObjects(Asteroid.class);
     
     if (left.isEmpty())
     {
         space.add();
        }
         
         
    }
 
}
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
import greenfoot.*;
 
/**
 * Space. Something for rockets to fly in.
 *
 * @author Michael Kölling
 * @version 1.2
 */
public class Space extends World
{
    private Counter scoreCounter;
    private int startAsteroids = 2;//Game will start with 2 asteroids
 
    /**
     * Create the space and all objects within it.
     */
    public Space()
    {
        super(600, 500, 1);
        GreenfootImage background = getBackground();
        background.setColor(Color.BLACK);
        background.fill();
        createStars(300);
 
        Rocket rocket = new Rocket();
        addObject(rocket, getWidth()/2 + 100, getHeight()/2);
 
        addAsteroids(startAsteroids);
 
        scoreCounter = new Counter("Score: ");
        addObject(scoreCounter, 60, 480);
 
        Explosion.initializeImages();
        ProtonWave.initializeImages();
    }
 
    /**
     * Add a given number of asteroids to our world. Asteroids are only added into
     * the left half of the world.
     */
    private void addAsteroids(int count)
    {
        for(int i = 0; i < count; i++)
        {
            int x = Greenfoot.getRandomNumber(getWidth()/2);
            int y = Greenfoot.getRandomNumber(getHeight()/2);
            addObject(new Asteroid(), x, y);
        }
    }
 
    /**
     * Crete a given number of stars in space.
     */
    private void createStars(int number)
    {
        GreenfootImage background = getBackground();            
        for(int i=0; i < number; i++)
        {
            int x = Greenfoot.getRandomNumber( getWidth() );
            int y = Greenfoot.getRandomNumber( getHeight() );
            int color = 120 - Greenfoot.getRandomNumber(100);
            background.setColor(new Color(color,color,color));
            background.fillOval(x, y, 2, 2);
        }
    }
 
    /**
     * This method is called when the game is over to display the final score.
     */
    public void gameOver()
    {
        addObject(new ScoreBoard(scoreCounter.getValue()), getWidth()/2, getHeight()/2);
    }
 
    /**
     * This is for to update the score
     */
    public void countScore(int change)
    {
        scoreCounter.add(change);
    }
 
    public void add()
    {
        startAsteroids++;
        addAsteroids(startAsteroids);
 
    }
 
}
Super_Hippo Super_Hippo

2019/11/26

#
The problem is that you call the “leftObject” method at the end of the act method (line 46). At that time, the object isn’t the world anymore if it was removed the “checkCollison” method. “getWorld” returns null (line 135) and you try to call a method on null in the next line. That’s why you get the NullpointerException. To fix it, you could move the call to the “leftObject” method to the beginning of the act method or at least before the call to the “checkCollision” method. As an alternative, make sure that the reference is not null before continuing.
dROS dROS

2019/11/26

#
Thank you so much for your help. you are awesome
You need to login to post a reply.