我正在使用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));
}
}
外環看起來不錯,但我有與內一個問題。建議嗎?
和哪一行是1737? – djechlin 2015-03-31 23:24:25
你有沒有試過運行舊版本? – 2015-03-31 23:24:53
@djechlin顯示 – MrD 2015-03-31 23:25:44