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

2017/3/22

NullPointerException

Nosson1459 Nosson1459

2017/3/22

#
When I run the following code:
import greenfoot.Color;
import greenfoot.Greenfoot;
import greenfoot.GreenfootImage;
import greenfoot.UserInfo;
import greenfoot.World;
import java.util.List;

/**
 * Write a description of class RaY here.
 * 
 * @author Builderboy2005
 * @version Uploaded: 2009/1/31
 */
public class RaY extends World
{
    int[] obbX = {900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900};
    double[] obbY = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290};
    int x, y, color = 0, score = 0, bestScore = 0, health = 3, offY, alpha = 128, accel;
    double slant;
    double speed = .7, offX = 0, count = -1;
    boolean scored = false;
    String me;
    GreenfootImage screen = new GreenfootImage(500, 300);

    List<UserInfo> highscores;
    List<UserInfo> nearbyscores;
    final static int SCORES_TO_DISPLAY = 10;
    Color flash;

    boolean scoreScreen = false;

    /**
     * Constructor for objects of class RaY.
     * 
     */
    public RaY() { 
        // Create a new world with 500x300 cells with a cell size of 1x1 pixels.
        super(500, 300, 1);
        for (int f = 8; f < 20; f++) obbX[f] = Greenfoot.getRandomNumber(80) - 40;
        screen = getBackground();
    }

    /**
     * Act - do whatever the RaY wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    @Override
    public void act()
    {
        // Add your action code here.
        screen.setColor(new Color(color, 0, 0, alpha));
        screen.fillRect(0, 0, 500, 300);

        count = count + speed;
        if (count > 15) {
            flash = new Color(Greenfoot.getRandomNumber(200) + 50, Greenfoot.getRandomNumber(200) + 50, Greenfoot.getRandomNumber(200) + 50);
            if (scored) flash = new Color(Greenfoot.getRandomNumber(100), Greenfoot.getRandomNumber(100), Greenfoot.getRandomNumber(100));
            count = 0;
        }

        if (health <= 0 && !scored) {
            UserInfo myInfo = UserInfo.getMyInfo();
            if (myInfo != null) {
                bestScore = myInfo.getScore();
                if (score > bestScore) {
                    myInfo.setScore(score);
                }
                for (int i = 0; i < UserInfo.NUM_INTS; i++) myInfo.setInt(i, 0xAABBCCDD);
                for(int i = 0; i < UserInfo.NUM_STRINGS; i++) myInfo.setString(i, "TESTSTRING");
                myInfo.store();
            }

            scored = true;
            highscores = UserInfo.getTop(10);
            nearbyscores = UserInfo.getNearby(10);
        }

        if (scored) {
            screen.setColor(flash);
            screen.drawString("Final Score: " + score, 5, 15);
            screen.drawString("Previous Best: " + bestScore, 5, 30);
            screen.drawString("Top Scores", 120, 60);

            for (int i = 0; i < highscores.size(); i++) {
                UserInfo u = highscores.get(i);
                screen.drawString(u.getRank() + ". " + u.getUserName() + ": " + u.getScore(), 100, i * 20 + 80);

                if (nearbyscores != null) {
                    screen.drawString("Similar Scores", 320, 60);
                    u = nearbyscores.get(i);
                    screen.drawString(u.getRank() + ". " + u.getUserName() + ": " + u.getScore(), 300, i * 20 + 80);
                }
            }
            return;
        }

        screen.setColor(new Color(70, 70, 70));
        x = 250 + (int) (270 * Math.atan2(40 - offX, 0));
        y = (int) (5000 / Math.sqrt((40 - offX) * (40 - offX)));
        screen.drawLine(250, 150, x, 150 - (int) (y / 2) + (int) (.002 * (250 - x) * slant));
        x = 250 + (int) (270 * Math.atan2(-40 - offX, 0));
        y = (int) (5000 / Math.sqrt((-40 - offX) * (-40 - offX)));
        screen.drawLine(250, 150, x, 150 - (int) (y / 2) + (int) (.002 * (250 - x) * slant));

        for(int f = -40; f <= 40; f += 5) {
            x = 250 + (int) (270 * Math.atan2(f - offX, 0));
            y = (int) (5000 / Math.sqrt((f - offX) * (f - offX)));
            screen.drawLine(250, 150, x, 150 + (int) (y / 2) + (int) (.002 * (250 - x) * slant));
        }

        screen.setColor(flash);
        screen.drawString(" " + score, 0, 12);
        for (double k = 0; k < 1; k += 0.05) {
            for (int f = 0; f < 30; f++) {
                x = 250 + (int) (270 * Math.atan2(obbX[f] - offX, obbY[f]));
                y = (int) (400 / Math.sqrt((obbX[f] - offX) * (obbX[f] - offX) + obbY[f] * obbY[f]));
                offY = 150 + (int) (270 * Math.atan2(4, obbY[f]));

                screen.drawOval(x - (int) (y / 2), offY - (int) (y / 2) + (int) (.002 * (250 - (x - (int) (y / 2))) * slant), y, y);
                obbY[f] -= speed * 0.05;
                if (obbY[f] < 9 && obbY[f] > 6 && Math.abs(obbX[f] - offX) < 1) {
                    color = 254;
                    obbY[f] = 290;
                    obbX[f] = Greenfoot.getRandomNumber(80) - 40;
                    health--;
                }
                if (obbY[f] < 5) {
                    obbY[f] = 290;
                    obbX[f] = Greenfoot.getRandomNumber(80) - 40;
                }
            }
        }

        if (Greenfoot.isKeyDown("left")) accel -= 5;
        if(Greenfoot.isKeyDown("right")) accel += 5;
        slant += (accel - slant) / 5.0;
        if (offX + accel / 100.0 > 39 || offX + accel / 100.0 < -39) accel = -accel;
        offX += accel / 100.0;
        if (accel > 0) accel--;
        if (accel < 0) accel++;
        speed += .0005;
        if (color > 0) color -= 2;
        score++;

        screen.drawRect(240, 290, 20, 10);

        if (Greenfoot.isKeyDown("t") && alpha > 0) alpha--;
        if (Greenfoot.isKeyDown("y") && alpha < 255) alpha++;
    }
}
I get this:
java.lang.NullPointerException
	at greenfoot.GreenfootImage.initGraphics(GreenfootImage.java:354)
	at greenfoot.GreenfootImage.getGraphics(GreenfootImage.java:342)
	at greenfoot.GreenfootImage.drawString(GreenfootImage.java:692)
	at RaY.act(RaY.java:112)
	at greenfoot.core.Simulation.actWorld(Simulation.java:610)
	at greenfoot.core.Simulation.runOneLoop(Simulation.java:545)
	at greenfoot.core.Simulation.runContent(Simulation.java:221)
	at greenfoot.core.Simulation.run(Simulation.java:211)
I edited Builderboy's scenario to version 3.1.0.
Super_Hippo Super_Hippo

2017/3/22

#
I think there is a chance that 'flash' is null and drawing with a 'null' color can't be done. I didn't test this yet and I don't know if it maybe was different in older Greenfoot versions, but it is an idea.
Nosson1459 Nosson1459

2017/3/22

#
Super_Hippo wrote...
I think there is a chance that 'flash' is null and drawing with a 'null' color can't be done. I didn't test this yet and I don't know if it maybe was different in older Greenfoot versions, but it is an idea.
You were right, I didn't notice that 'flash' wasn't set yet. I edited line 28 to:
Color flash = new Color(70, 70, 70);
You need to login to post a reply.