2013-03-27 3 views
0

Gridworld를 사용하여 Conway의 삶의 게임을 만들려고합니다. 나는 "단계"여기Game of Life 그리드 월드 NullPointer 런타임 오류

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; 
    } 

} 

셀 (녀석의 변형)이다

을하려고 할 때 모든 컴파일은하지만 오류가 계속
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 (러너/드라이버 파일)

,691,363

cellsToAdd.add(a); 

당신은 Cell의 생성자에서이 작업을 수행 할 수 있습니다 :이 라인에 던져 질하는 NPE의 원인이

private ArrayList<Location> cellsToAdd; 

: (210)

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(); 
    } 

} 
+0

디버거 정말 편리 할 것입니다 곳입니다. 하나를 사용했다면 예외가 발생하는 순간 프로그램의 정확한 상태를 검사 할 수 있습니다. – NPE

답변

2

당신은 클래스 CellListcellsToAdd 초기화되지 않습니다 :

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

옆 : 자바에서 가장 선호되는 방법은 인터페이스를 코딩하는 것입니다. 이것에 의해, List으로서의 구현을 다른 구현으로 간단하게 바꿀 수 있습니다.

private List<Location> cellsToAdd; 

은 자세한 herehere

관련 문제