2015-03-31 67 views
1

我正在使用MASON庫來運行簡單的基於代理的模型。基於代理的模型中的Java NullPointerException

按照規範,我打算通過雙擊Portrayal中的代理來訪問代理的檢查員。

然而,當我這樣做,我得到以下控制檯錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at sim.display.Display2D.createInspectors(Display2D.java:1737) 
    at sim.display.Display2D$8.mouseClicked(Display2D.java:1392) 

我去Display2D.java:1737發現:

public void createInspectors(final Rectangle2D.Double rect, final GUIState simulation) 
     { 
     Bag inspectors = new Bag(); 
     Bag names = new Bag(); 

     Bag[] hitObjects = objectsHitBy(rect); 
     for(int x=0;x<hitObjects.length;x++) 
      { 
      FieldPortrayal2DHolder p = (FieldPortrayal2DHolder)(portrayals.get(x)); 
      for(int i = 0 ; i < hitObjects[x].numObjs ; i++) 
       { 
       LocationWrapper wrapper = (LocationWrapper) (hitObjects[x].objs[i]); 
       inspectors.add(p.portrayal.getInspector(wrapper,simulation)); 
       names.add(p.portrayal.getName(wrapper)); 
       } 
      } 
     simulation.controller.setInspectors(inspectors,names); //1737 
     } 

然而,這是一個庫文件,我不熟悉它。

有什麼建議嗎?

庫:cs.gmu.edu/~eclab/projects/mason/

更新:

好了,它變得有趣...

我沒有回聲上的toString方法檢查員和名字,返回:

insepectors [email protected] names [email protected] 

好吧,所以他們是袋,一種集合。時間得到他們的大小...

insepectors 1 names 1 

好,他們不是空的。

讓我們跟隨錯誤堆棧

下一頁位:

at sim.display.Display2D$8.mouseClicked(Display2D.java:1392) 

// add mouse listener for the inspectors 
     insideDisplay.addMouseListener(new MouseAdapter() 
      { 
      public void mouseClicked(MouseEvent e) 
       { 
       if (handleMouseEvent(e)) { repaint(); return; } 
       else 
        { 
        // we only care about mouse button 1. Perhaps in the future we may eliminate some key modifiers as well 
        int modifiers = e.getModifiers(); 
        if ((modifiers & e.BUTTON1_MASK) == e.BUTTON1_MASK) 
         { 
         final Point point = e.getPoint(); 
         if(e.getClickCount() == 2) 
          1392-> createInspectors(new Rectangle2D.Double(point.x, point.y, 1, 1), 
           Display2D.this.simulation); 
         if (e.getClickCount() == 1 || e.getClickCount() == 2) // in both situations 
          performSelection(new Rectangle2D.Double(point.x, point.y, 1, 1)); 
         repaint(); 
         } 
        } 
       } 

好,誤差顯然是在CreateInspectors方法:

public void createInspectors(final Rectangle2D.Double rect, final GUIState simulation) 
     { 
     Bag inspectors = new Bag(); 
     Bag names = new Bag(); 

     Bag[] hitObjects = objectsHitBy(rect); 
     for(int x=0;x<hitObjects.length;x++) 
      { 
      FieldPortrayal2DHolder p = (FieldPortrayal2DHolder)(portrayals.get(x)); 
      for(int i = 0 ; i < hitObjects[x].numObjs ; i++) 
       { 
       LocationWrapper wrapper = (LocationWrapper) (hitObjects[x].objs[i]); 
       inspectors.add(p.portrayal.getInspector(wrapper,simulation)); 
       names.add(p.portrayal.getName(wrapper)); 
       } 
      } 
     System.out.println("insepectors " + inspectors.size() + " names " + names.size()); 
     simulation.controller.setInspectors(inspectors,names); 
     } 

第一件事,我做的:

System.out.println(rect.getCenterX() + " " + rect.getCenterY()); 

這給了我646.5 659.5。看起來像座標一樣合理。

所以接下來的事情,我想看看hitObjects:

System.out.println(hitObjects.length); 

返回2。於是,我只好在那個座標二級代理商。

我假設NPE是這裏的某個地方:

for(int x=0;x<hitObjects.length;x++) 
      { 
      FieldPortrayal2DHolder p = (FieldPortrayal2DHolder)(portrayals.get(x)); 
      for(int i = 0 ; i < hitObjects[x].numObjs ; i++) 
       { 
       LocationWrapper wrapper = (LocationWrapper) (hitObjects[x].objs[i]); 
       inspectors.add(p.portrayal.getInspector(wrapper,simulation)); 
       names.add(p.portrayal.getName(wrapper)); 
       } 
      } 

外環看起來不錯,但我有與內一個問題。建議嗎?

+0

和哪一行是1737? – djechlin 2015-03-31 23:24:25

+0

你有沒有試過運行舊版本? – 2015-03-31 23:24:53

+0

@djechlin顯示 – MrD 2015-03-31 23:25:44

回答

1

我實際上會寫出如何通過給出的庫代碼進行推理,只要你自從你聽起來有能力之後就已經到了。

您找到了代碼。這是一個好的開始。你還發現,它的上線:

simulation.controller.setInspectors(inspectors,names); //1737 

並給予你知道的NPE什麼,你可以有理由相信simulationcontrollernull

你知道嗎?你能否推斷你的代碼,你可能沒有設置,或通過不正確?你可以在你的代碼中放置一個調試器斷點或簡單的println語句來確定哪個?

如果不是,並且您使用的是IDE(您可能是),那麼從剛打開的源代碼開始,在1737行之前放置一個斷點。當到達該行時,使用調試器檢查變量simulation,然後simulation.controller看哪個是null。具體怎麼做取決於你的IDE,但不應該很難找到using XKCD's tech support cheat sheet

然後你可能會知道原因。如果不是,繼續閱讀源代碼,例如看起來等級高達1737行。

+0

我更新了我的答案,進一步得到了一些,但後來卡住了:\ – MrD 2015-04-01 00:09:15

+0

@ max0005您仍然沒有回答模擬或控制器是否爲空。 – djechlin 2015-04-01 00:18:33

+0

@djechilin爲模擬對象我得到[email protected]與toString方法,當我添加控制器,所以試圖回聲System.out.println(simulation.controller.toString()+「*」 );我得到NPE,所以我想我對控制器有問題? – MrD 2015-04-01 00:24:45