2016-12-06 1 views
0

Je sais que c'est un problème courant et j'ai déjà lu certains messages, mais je n'ai pas encore trouvé la cause de l'erreur.Erreur de réception (IndexOutOfBoundsException) lorsque son nombre plus élevé d'objets dans la liste de tableaux

J'ai des périphériques qui obtiennent des paramètres à partir d'un fichier json et le code génère des topologies pour ces périphériques. J'ai une liste de piconets (petits groupes maître-esclave) et le problème est que le code fonctionne assez bien jusqu'à 45 nombre d'appareils. Quand j'augmente le nombre de périphériques, j'obtiens l'erreur ci-dessous;

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) 

et où l'affichage est;

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

` getDevPiconet(). Get (0) est de donner l'erreur et voici le code de classe,

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 

On dirait qu'il échoue parce que le DevPiconet est vide, mais cela fonctionne pour d'autres nombre d'appareils ... Je ne comprends pas pourquoi cela ne fonctionne pas lorsque son nombre accru d'appareils.

S'il vous plaît laissez-moi savoir si vous avez une idée ou une suggestion,

Merci à l'avance,

BR

+0

donc vous obtenez l'erreur si vous avez 46 ou plusieurs dispositifs? n'y at-il pas une erreur dans votre code au constructeur de 'BleMeshTopologyCtrlBlock'? Je ne peux pas voir le '{' être fermé avant la prochaine méthode – XtremeBaumer

+0

Oui, je reçois une erreur après 45 appareils. Constructeur afer le dernier constructeur –

+0

pouvez-vous poster le code complet de votre projet? – XtremeBaumer

Répondre

0

d'abord afin d'éviter des exceptions que vous devriez vérifier pour pointeur NULL et la taille de la matrice de votre piconet qui est au lieu de vérifier la valeur du premier élément de rôle dev:

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

Vérifiez d'abord que le tableau n'est pas nulle et son si ze est plus de 0:

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

De cette façon, vous ne vérifiez que les valeurs valides.

En ce qui concerne le nombre des dispositifs liés à la question logique métier et plus d'informations sur ce que vous faites est nécessaire pour déterminer