2016-12-06 38 views
0

我知道这是一个常见问题,我已经阅读了一些帖子,但找不到错误的根本原因。当数组列表中的对象数量较多时,接收错误(IndexOutOfBoundsException)

我有设备从json文件中获取参数,代码为这些设备生成拓扑。 我有一个微微网列表(小主从组),问题是代码工作得很好,最多可达45个设备。当我增加设备的数量时,我得到下面的错误;

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at KTHBleMesh.BleMeshDevice.construct(BleMeshDevice.java:508) 
    at KTHBleMesh.BleMeshDevice$2.run(BleMeshDevice.java:468) 
    at KTHBleMesh.Event.run(l2.java:21) 
    at KTHBleMesh.Simulator.doAllEvents(l2.java:50) 
    at KTHBleMesh.IteratorEngine.main(IteratorEngine.java:85) 

并且弹出的位置是;

List<BleMeshDevice> neighboringDevices =this.getTxManager().getNeighbouringDevices(this); 
       for (BleMeshDevice neighDevice : neighboringDevices) { 
        if (neighDevice.devMiddleware.getTopologyCtrlBlock().getDevPiconet().get(0).getDevRole()==1) 

` getDevPiconet()得到(0)给该错误,这里是类代码,

public BleMeshTopologyCtrlBlock() { 
     devPiconet = new ArrayList<BleMeshDevicePiconet>(2); 

private void AddMastertoSlave(BleMeshDevice linkMaster, 
      BleMeshDevice linkSlave, int devRole) { 

     devPiconet.add(new BleMeshDevicePiconet(devRole, linkSlave)); 
     devPiconet.get(devPiconet.size() -1).getDevSlaves().add(linkMaster); 


for (BleMeshDevGatewayTable aRow : getDevPiconet().get(0) 
       .getGatewaytable()) { 
      if (aRow.getPicRemoteMaster().equals(aNeighPiconetMaster) 
        && aRow.getPicLocalGatewayDev().getDevMiddleware() 
          .getTopologyCtrlBlock().getCapacity() > 0 
        && aRow.getPicRemoteGatewayDev().getDevMiddleware() 
          .getTopologyCtrlBlock().getCapacity() > 0 

看起来它失败,因为DevPiconet是空的,但它适用于其他设备数量...我不明白为什么它的设备数量增加时无法正常工作。

请让我知道如果您有任何线索或建议,

由于提前,

BR

+0

所以如果你有46级或更多的设备你的错误的详细信息? 'BleMeshTopologyCtrlBlock'的构造函数代码中没有错误吗?我看不到'{'在下一个方法之前关闭 – XtremeBaumer

+0

是的,我在45个设备后出现错误。构造函数拥有最后一个构造函数 –

+0

你可以发布你的项目的完整代码吗? – XtremeBaumer

回答

0

一是为了防止你应该检查的空指针和数组大小例外您微微网而不是检查第一项开发角色的值:

if (neighDevice.devMiddleware.getTopologyCtrlBlock().getDevPiconet().get(0).getDevRole()==1) 

首先检查数组是否为空并且他的si ze多于0:

if (neighDevice.devMiddleware.getTopologyCtrlBlock().getDevPiconet() != null && neighDevice.devMiddleware.getTopologyCtrlBlock().getDevPiconet().size() > 0 && neighDevice.devMiddleware.getTopologyCtrlBlock().getDevPiconet().get(0).getDevRole()==1) 

这样你只能检查有效值。

关于设备数量的问题及其相关的业务逻辑,并约你在做什么需要确定