0

尝试使用 Gridworld 制作康威的生命游戏。一切都可以编译,但是当我尝试采取“步骤”时,我不断收到错误消息

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Cell.processSurrondings(Cell.java:27)
at Cell.act(Cell.java:44)
at info.gridworld.actor.ActorWorld.step(ActorWorld.java:68)
at info.gridworld.gui.GUIController.step(GUIController.java:134)
at info.gridworld.gui.GUIController$4.actionPerformed(GUIController.java:247)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:702)
at java.awt.EventQueue$4.run(EventQueue.java:700)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

以下是 lifeWorld 文件(actorWorld 的变体)

import info.gridworld.actor.Actor;
import info.gridworld.actor.ActorWorld;
import info.gridworld.grid.Location;
import info.gridworld.grid.UnboundedGrid;

import java.util.ArrayList;

public class lifeWorld extends ActorWorld {

    private static final String FIRST_LINE = "Welcome to Ern's Game of Life. (A rip off of Conway's Game of Life)\n" +
            "Click a live cell to kill it, a dead cell to resurect it, or run to run the cycles!";

    public lifeWorld() {
        setGrid(new UnboundedGrid<Actor>());
        System.setProperty("info.gridworld.gui.selection", "hide");
        System.setProperty("info.gridworld.gui.tooltips", "hide");
        System.setProperty("info.gridworld.gui.frametitle", "Ern's Game of Life");
    }


    private String setMessage() {
        return FIRST_LINE;
    }

    public boolean locationClicked(Location loc) {
        if (getGrid().get(loc) == null)
            new Cell().putSelfInGrid(getGrid(), loc);
        else
            getGrid().get(loc).removeSelfFromGrid();
        return true;
    }

}

细胞(Critter 的变体)

import info.gridworld.actor.Actor;
import info.gridworld.grid.Location;

import java.awt.Color;

import java.util.ArrayList;


public class Cell extends Actor {

    private boolean planning;   
    private boolean dies;
    private ArrayList<Location> cellsToAdd;

    public Cell() {
        setColor(Color.BLACK);
        planning = true;
        dies = false;
    }

    private void processSurrondings(){
        ArrayList<Location> adjCells = getGrid().getOccupiedAdjacentLocations(getLocation());
        ArrayList<Location> cellsAdd = new ArrayList<Location>();
        if(adjCells.size() > 0)
            for(Location a: adjCells)
                if(getGrid().getOccupiedAdjacentLocations(a).size() == 3)
                    cellsToAdd.add(a); //The error happens here apparently
        ArrayList<Location> isDead = getGrid().getOccupiedAdjacentLocations(getLocation());
        dies = (!(isDead.size() == 2 || isDead.size() == 3));
    }

    private void executeStep() {
        for(Location a: cellsToAdd){
            Cell cell = new Cell();
            cell.putSelfInGrid(getGrid(),a);

        }
        if(dies)
            removeSelfFromGrid();
    }   

    public void act() {
        if (planning) {
            processSurrondings();
            planning = !(planning);
        }
        else
            this.executeStep();
    }   
}

GameOfLifeRunner(跑步者/驱动程序文件)

import info.gridworld.actor.ActorWorld;
import info.gridworld.grid.UnboundedGrid;
import info.gridworld.actor.Actor;

public class GameOfLifeRunner {

    public static void main(String[] args) {
        lifeWorld world = new lifeWorld();
        world.show();
    }

}
4

1 回答 1

2

List cellsToAdd你永远不会在类中初始化Cell

private ArrayList<Location> cellsToAdd;

导致NPE在这条线上抛出:

cellsToAdd.add(a); 

您可以在以下构造函数中执行此操作Cell

public Cell() {
   cellsToAdd = new ArrayList<Location>();
   ...

旁白: Java 中的首选方法是对接口进行编码。这允许List容易地与其他实现交换的实现。

private List<Location> cellsToAdd;

在这里这里查看更多

于 2013-03-27T15:02:21.333 回答