【问题标题】:Null pointer exception error, we meet again空指针异常错误,我们又见面了
【发布时间】:2015-10-24 21:32:48
【问题描述】:

我最终决定为我的记忆游戏制作实际的游戏部分,但我再次收到空指针异常错误。我之前已经在这里问过同样的问题,所以如果这算作垃圾邮件,我很抱歉,但我根本不知道问题出在哪里!

是的,我是编程新手,所以稍微解释一下为什么必须“在此处插入答案”会很有帮助!

现在这是我的 Square 课程(这些是您必须记住的正方形以及游戏从哪里开始):

package data.src;

import java.util.Random;

import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.StateBasedGame;

public class Square {

    private StateBasedGame game;
    boolean correct;
    boolean clickable;
    boolean clicked;
    boolean started;
    int squares;
    int squareX;
    int squareY;
    public Image squareIncorrect;
    public Image squareCorrect;

    //For drawing these images from other classes
    {
        try {
            squareIncorrect = new Image("res/squareIncorrect.png");
        } catch (SlickException e1) {

            e1.printStackTrace();
        }
        try {
            squareCorrect =  new Image("res/squareCorrect.png");
        }
        catch (SlickException e) {

            e.printStackTrace();
        }
    }

    public Square(GameContainer container) {
                container.getGraphics();

    }

    public boolean checkCorrect(){
        return correct;

    }

    public boolean checkClickable(){
        return clickable;
    }

    public boolean checkClicked(){
        return clicked;

    }

    public int returnNumberOfSquares(){
        return squares;

    }

    //Draw appropriate square on screen depending on the creatRandom. CREATE THE RANDOM FIRST!
    public void squareDraw(int x ,int y, Graphics g)throws SlickException{

        if(correct == true){
            g.drawImage(squareCorrect, x, y);

        }
        else if(correct == false){
            g.drawImage(squareIncorrect, x, y);

        }
    }

    public void createRandom() {

        Random rand = new Random();
        int sRand = rand.nextInt(2);

        if(sRand == 0) {
            correct = false;
            clickable = true;
            clicked = false;
            System.out.println("This square is a phony!");

        }
        else if (sRand == 1) {
            correct = true;
            clickable = true;
            clicked = false;
            System.out.println("This is a true Square!");
            squares = squares+1;
        }
    }

    public void youWin(int x, int y, Graphics g){
        if (squares == 0) {
            g.drawString("You win!", x, y);
            try {
                wait(4000);
                game.enterState(0);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //Normal mode Methods begin here. Ends at EndGame().
    public void  startGame(Graphics g) throws SlickException {

        g.setColor(Color.red);
        g.drawString("Remember the squares! The game starts in 5 seconds!", 300, 200);
        clickable = false;
        started = false;
        try {
            game.wait(5000);
            started = true;
            clickable = true;
            returnNumberOfSquares();
            squareCorrect = new Image("res/squareIncorrect");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这是我的 NormalMode 类(我在其中调用 square 的方法并渲染事物):

package data.src;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class NormalMode extends BasicGameState {

    private Square[][] square = new Square[4][4];
    private Square gameStarter;
    private Graphics g;

    public NormalMode() {

    }

    @Override
    public void init(GameContainer arg0, StateBasedGame Game)throws SlickException {
        gameStarter = new Square(arg0);
        gameStarter.startGame(g);
        for (int i = 0; i < square.length; i++){
            for(int j = 0; j < square.length; j++){
                square[i][j] = new Square(arg0);
                square[i][j].createRandom();

            }
        }
    }

    @Override
    public void render(GameContainer container, StateBasedGame game, Graphics g)
           throws SlickException {

        square[0][0].squareDraw(100, 300, g);
        square[0][1].squareDraw(150, 300, g);
        square[0][2].squareDraw(200, 300, g);
        square[0][3].squareDraw(250, 300, g);

        square[1][0].squareDraw(100, 400, g);
        square[1][1].squareDraw(150, 400, g);
        square[1][2].squareDraw(200, 400, g);
        square[1][3].squareDraw(250, 400, g);

        square[2][0].squareDraw(100, 500, g);
        square[2][1].squareDraw(150, 500, g);
        square[2][2].squareDraw(200, 500, g);
        square[2][3].squareDraw(250, 500, g);

        square[3][0].squareDraw(100, 600, g);
        square[3][1].squareDraw(150, 600, g);
        square[3][2].squareDraw(200, 600, g);
        square[3][3].squareDraw(250, 600, g);
    }

    @Override
    public void update(GameContainer container, StateBasedGame game, int delta)
            throws SlickException {

    }

    @Override
    public int getID() {
        return 3;
    }
}

我也在使用美妙的 Slick2D 库!如果它有更好的文档就好了。

错误:

Exception in thread "main" java.lang.NullPointerException
    at data.src.NormalMode.init(NormalMode.java:22)
    at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:171)
    at org.newdawn.slick.ScalableGame.init(ScalableGame.java:69)
    at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
    at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
    at data.src.Core.main(Core.java:30)

【问题讨论】:

  • 你能发布一个堆栈跟踪吗?
  • 是的,对不起,我以为我把它放进去了!

标签: java graphics nullpointerexception drawing slick2d


【解决方案1】:

您永远不会在NormalMode 中初始化gameStarter,因此当您尝试在NormalMode#init() 中调用gameStarter.startGame(g); 时,您是在尝试对一个空对象执行一个方法。

其实你有很多地方没有初始化字段:

  • game 在课堂上Square(在Square#startGame() 中调用game.wait(5000);
  • g 在课堂上 NormalMode (传递给 Square#startGame() 使用它的地方)

【讨论】:

  • 我这样做了,但我仍然收到 nullpointerexception 错误:data.src.Square.startGame(Square.java:115) at data.src 的线程“main”中的异常 java.lang.NullPointerException .NormalMode.init(NormalMode.java:23) 在 org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:171) 在 org.newdawn.slick.ScalableGame.init(ScalableGame.java:69) 在 org. newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393) 在 org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317) 在 data.src.Core.main(Core.java:30)
  • @MrPork 我已经更新了我的答案,以反映您未能初始化的另外两个位置。
  • 那么你是如何初始化一个图形上下文的呢?我想不通。
  • 另外,我如何初始化gameStarter?我以为只是做“gameStarter = new Square(arg0”就行了?
  • @MrPork 这是你的应用程序,我不知道如何初始化你所有的自定义类。就Graphics 而言,我想你应该从这段代码上游的某个地方继承它。
【解决方案2】:

您需要将gameStarter 设置为某个值。目前,您将其保留为 null。

【讨论】:

    【解决方案3】:

    在我的记事本应用程序中,发生了这个异常,因为我指向一个未初始化的变量...所以您需要初始化 gamestarter...希望它能正常工作:)

    【讨论】:

    • 我做到了,但它仍然给我同样的错误,我更新了正常模式类。
    • 还有问题吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2013-03-15
    • 2013-03-22
    相关资源
    最近更新 更多