罕见的空指针异常(游戏编程Java)

罕见的空指针异常(游戏编程Java),java,Java,我正在用Java构建这个游戏。基本上,它是2D中的minecraft。我这样做是为了在按下时删除块对象。我的块对象渲染有时会在单击/删除块(大约200个块后随机)后出现nullpointerexception。游戏在渲染循环中时,对象似乎有时会被删除。当我添加一个try-catch时,下一个渲染周期不再有错误。你知道这是什么原因吗?这是一个坚实的游戏循环,我怀疑这是造成我的错误 我的处理程序中的Render方法: LinkedList<GameObject> object = new

我正在用Java构建这个游戏。基本上,它是2D中的minecraft。我这样做是为了在按下时删除块对象。我的块对象渲染有时会在单击/删除块(大约200个块后随机)后出现nullpointerexception。游戏在渲染循环中时,对象似乎有时会被删除。当我添加一个try-catch时,下一个渲染周期不再有错误。你知道这是什么原因吗?这是一个坚实的游戏循环,我怀疑这是造成我的错误

我的处理程序中的Render方法:

LinkedList<GameObject> object = new LinkedList<GameObject>();

public void render(Graphics g){
    for(int i = 0; i < object.size(); i++){
        GameObject tempObject = object.get(i);//sometimes nullpointer when getting the object I clicked on
        tempObject.render(g);
    }
}

我假设您的鼠标输入处理程序作为一个单独的线程运行。在这种情况下,可以在渲染循环中删除块


解决方案不是立即在鼠标处理程序中删除块,而是将要删除的块保存在单独的数组中。在渲染之前,可以在主循环中的专用位置处理这些块。

最有可能的情况是,当渲染在另一个线程中运行时,鼠标处理程序正在AWT线程中运行。在这种情况下,您将遇到并发问题

尝试使用关键部分

public static Object lock = new Object();

public void render(Graphics g){
    synchronized(lock)
    {
        for(int i = 0; i < object.size(); i++){
            GameObject tempObject = object.get(i);//sometimes nullpointer when getting the object I clicked on
           tempObject.render(g);
        }
    }
}

void mouseInputHandler()
{
    synchronized( lock )
    {
        code
    }
}
公共静态对象锁=新对象();
公共空间渲染(图形g){
已同步(锁定)
{
对于(int i=0;i

了解更多关于代码结构的信息可以更好地改进这一点,但这会让您朝着正确的方向前进。

假设您使用不同的线程来更新游戏状态和渲染,这种行为对我来说并不奇怪,因为一个线程可能在另一个线程尝试渲染时删除了对象


调试的一个好方法是强制顺序执行代码。检查当前行为是否持续。可以找到游戏循环的一个很好的介绍(Android)

线程结构是什么?游戏循环在哪里运行?
public void run() {
    this.requestFocus();
    long lastTime = System.nanoTime();
    double amountOfTicks = 60;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int frames = 0;
    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
            while(delta >= 1){
                tick();
                delta--;
            }
        if(running)
            render();
        frames++;

        if(System.currentTimeMillis() - timer > 1000){
            timer += 1000;
            //System.out.println("FPS: " + frames);
            frames = 0;
        }
    }
    stop();
}
public static Object lock = new Object();

public void render(Graphics g){
    synchronized(lock)
    {
        for(int i = 0; i < object.size(); i++){
            GameObject tempObject = object.get(i);//sometimes nullpointer when getting the object I clicked on
           tempObject.render(g);
        }
    }
}

void mouseInputHandler()
{
    synchronized( lock )
    {
        code
    }
}