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:
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:
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?
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.
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:
    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:
                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.