Aide - Recherche - Membres - Calendrier
Version complète : Message d'erreur : index out of bounds
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
Moustik78
Bonjour,

Je suis en train de m'arracher les cheveux sur un message d'erreur qui intervient aléatoirement dans mon application. Ce message est de type "Debug", mais je n'arrive pas à situer d'où vient l'erreur. A force de chercher, et vu comment est déclenchée cette erreur (totalement aléatoirement, un coup ça va, un coup ça va pas, et pas toujours au même moment), je me demande si ce n'est pas un bug due à Flex. La plupart du temps, cette erreur survint quand je cache une vue et que je la réaffiche (j'utilise une architecture MVC).

Pour info j'utilise le plugin Flex pour Eclipse.

Sans plus attendre, voici le libellé de l'erreur :

CODE
RangeError: Error #2006: L'index indiqué sort des limites.
    at flash.display::DisplayObjectContainer/getChildAt()
    at mx.core::Container/getChildAt()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2369]
    at mx.containers.utilityClasses::CanvasLayout/updateDisplayList()[C:\dev\flex_201_gmc\sdk\frameworks\mx\containers\utilityClasses\CanvasLayout.as:207]
    at mx.containers::Canvas/mx.containers:Canvas::updateDisplayList()[C:\dev\flex_201_gmc\sdk\frameworks\mx\containers\Canvas.as:256]
    at mx.core::UIComponent/validateDisplayList()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:5760]
    at mx.core::Container/validateDisplayList()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2706]
    at mx.managers::LayoutManager/mx.managers:LayoutManager::validateDisplayList()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:600]
    at mx.managers::LayoutManager/mx.managers:LayoutManager::doPhasedInstantiation()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:673]
    at mx.managers::LayoutManager/validateNow()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:726]
    at mx.effects::Tween$/mx.effects:Tween::timerHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\effects\Tween.as:187]
    at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
    at flash.utils::Timer/flash.utils:Timer::tick()


Et comme vous pouvez le voir, toutes les lignes et fichiers renseignés sont des fichiers propres à Flex, donc aucun renseignement sur l'un des mes fichiers. Bien étrange...

Quelqu'un aurait-il déjà eu une erreur de ce genre? Ou entendu parler? Quelqu'un aurait-il une idée?
Fusion
getChildAt() + index out of bounds : à vue d'oeil, tu vas chercher un élément dans un tableau (ArrayCollection ou autre), et tu utilises un index plus grand ou plus petit que la taille du tableau.

Exemple : si ton tableau appelé tab est de taille 3, et que tu appelles tab.getItemAt(3), tab.getItemAt(4), tab.getItemAt(-1), tu auras un index out of bounds.

En résumé, vérifie ton compteur. C'est logique que ça arrive à l'exécution, car la compilation ne détecte pas les compteurs incorrects...
Fusion
Oups. Effectivement, pas une seule des fonctions n'est à toi. Je t'ai bien expliqué quel était le bug, mais pas comment le résoudre.
Sinon, tu dis que ça arrive quand tu affiches/caches une vue? Tu peux montrer comment tu fais?
Moustik78
Salut Fusion, merci de ton aide wink.gif

Et bien cela arrive entre autre quand je joue avec mes vues. Montrer le code risque d'être fastidieux, car je passe par le framework de mon entreprise, mais en gros :

- le Framework possède une classe Controller qui se charge de créer des instances (de manière dynamique), des différents MVC qui composent mon application. Par exemple, dans le cadre du problème de l'index out of bounds, j'ai un MVC pour un datagrid, un MVC pour un canvas et un MVC pour un formulaire.
Le datagrid et le canvas sont présentés côte à côte. Pour chacun de ces MVC, je dispose de 3 classes (controller/model/vue). Bon, c'est pas la peine que je rentre dans les détails je pense :/

- Mon but : je clique sur un bouton, et ce datagrid et ce canvas disparaissent et laissent place au formulaire.

- Comment je procède : le Controller du Framework dispose de méthodes displayView() et removeView()
removeView() ne détruit pas la vue passée en paramètre, elle la détache juste du container qui la contient (un removeChild en gros).
displayView() raccroche la vue passée en paramètre au container qu'on passe également en paramètre.

En gros, les vues ne sont jamais détruites, elles sont justes détachées ou rattachées de l'application principale, ce qui a pour effet de les cacher à l'oeil de l'utilisateur.

Je sais pas si j'ai été assez clair... Je pourrai copier quelques bouts de code, mais cette architecture MVC avec le Framework n'est pas très simple :/



Je ne sais pas si le problème vient de là, mais en tout cas le message d'erreur apparait principalement lorsque j'affiche/cache les vues du datagrid et du canvas, ainsi que du formulaire. icon_question.gif
Tonic
Salut,

j'ai à peu près le même problème que toi en ce moment :

CITATION
RangeError: Error #2006: L'index indiqué sort des limites.
at flash.display::DisplayObjectContainer/addChildAt()
at mx.core::UIComponent/http://www.adobe.com/2006/flex/mx/internal::$addChildAt()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:4676]
at mx.core::UIComponent/addChildAt()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:4583]
at mx.effects::EffectManager$/mx.effects:EffectManager::removedEffectHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\effects\EffectManager.as:736]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher2()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7909]
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7852]
ot an IEventDispatcher)


Je sais d'où vient mon problème, mais je ne trouve pas vraiment de solution.

Explication : j'utilise une tileList, contenant un ItemRenderer personnalisé.
Sur click d'un item dans ma tileList, je joue avec la propriété "maxColumns" que je passe par exemple de "3" à "1". Sur click d'un bouton cela repasse de "1" à "3". Sur click d'un item, de "3" à "1", etc.

Pour que ces changement soient prit en compte sur l'interface, j'utilise la méthode "invalidateList()" sur ma tileList.

Le problème, souvent lorsque je repasse de maxColumns à "3" vers "1", j'ai cette jolie erreur. Mais cela est aléatoire, donc difficile de comprendre ce qui ne va pas...

Peux tu décrire un peu plus ce qui te provoque cette erreur?

Y a t'il un évènement à attendre avant de modifier ce genre de propriété (j'ai essayé UPDATE_COMPLETE, sans succès).

Merci d'avance icon_razz.gif
Moustik78
Salut Tonic ! smile.gif

Et bien, mon patron vient de me dire un autre évènement qui déclenche cette erreur. Un simple redimensionnement manuel de la fenêtre provoque parfois cette erreur. "Parfois", c'est ce qui est le plus étrange... Encore cette erreur serait récurrente, mais non même pas...

J'ai l'impression que ton erreur est complètement identique à la mienne : aléatoire, fichiers systèmes précisés dans l'erreur, addChild/GetChild, ...

Franchement je bute. Je ne vois pas trop comment résoudre cette erreur. Pour mon histoire de vues qui se détachent ou se rattachent au container principal, j'ai tenté de mettre des setTimeOut() (même si je n'aime pas trop ça), mais rien n'y fait. Même si je laisse du temps aux vues de se construire, l'erreur persiste :/

S'il y a un évènement à attendre... Pas bête cette idée de COMPLETE_UPDATE. Mais en effet, ça ne semble pas venir de là. icon_sad.gif
Tonic
As tu trouvé quelque chose Moustik?

Je sèche, j'ai essayé de reproduire le problème dans un exemple simple, mais impossible de reproduire l'erreur icon_confused.gif

Je n'arrive même pas à cibler concrètement le problème par des Try / catch, puisque le problème ne se situe pas dans mon code...
Moustik78
Hélas non... :'(

Je pense que je vais appeler le support demain. Je ne sais pas si ça va m'aider (ni si je vais bien réussir à faire comprendre le problème xD ), mais ça se tente.

Si jamais j'ai des pistes, je viendrai les décrire ici, promis wink.gif
Tonic
Ca y est j'ai trouve le problème ! icon_razz.gif icon_razz.gif icon_razz.gif
Une journée entière pour débugger, mais bon... icon_rolleyes.gif

Bref, mon problème se situe dans l'itemrenderer de mon TileList. Dès que je mets un effet de Fade sur ma Vbox, au bout d'un moment, ca plante (le problème c'est que ca plante au bout de la 2ème/3ème fois, après plus rien pendant 10 fois, ensuite ca replante, etc, donc difficile à débugger).

Donc ma Vbox qui me sert de ItemRenderer avant :

CODE
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"    
    paddingRight="10"
    paddingLeft="10"
    paddingBottom="10"
    paddingTop="10"    
    removedEffect="{fadeOut}"
    addedEffect="{fadeIn}"     
    xmlns:MyMxmlComponents="com.tonic.mxml.*"
        xmlns:ctrl="com.tonic.utils.SuperImage.qs.controls.*"
    >
     <mx:Style source="../../../css/styleLibrary.css" />
     <mx:Fade id="fadeOut" duration="1000" alphaFrom="1.0" alphaTo="0.0"/>
         <mx:Fade id="fadeIn" duration="1000" alphaFrom="0.0" alphaTo="1.0"/>


Ma Vbox maintenant :
CODE
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"    
    paddingRight="10"
    paddingLeft="10"
    paddingBottom="10"
    paddingTop="10"    
    xmlns:MyMxmlComponents="com.tonic.mxml.*"
    xmlns:ctrl="com.tonic.utils.SuperImage.qs.controls.*"
    >
     <mx:Style source="../../../css/styleLibrary.css" />

J'ai donc tout simplement enlevé les effet de Fade sur mes Item, et je n'aie plus de bug depuis.

Maintenant, savoir pourquoi c'est un autre problème. Je pense que le problème vient du fait qu'on ne peux pas faire un invalidateDisplayList alors qu'il y a des effets en cours sur les item de la TileList. Et encore, je ne peux pas en être sûr, puisque même en attendant que l'effet soit bel et bien fini, il y avait tout de même plantage.

Effet sur item et rafraichissement de conteneur ne font pas bon ménage en tout cas.

Pour ton problème, tu devrais peut être commencer par enlever tout les effets que tu as, faire un projet ultra simple, et faire des tests. Post ton projet si tu veux icon_wink.gif
Moustik78
Ah intéressant ça... J'ai en effet des effets de resize et de move sur mon appli. Je vais essayer de tout mettre à "end" pour voir (il va falloir que je vois comment goupiller tout ça).

Merci beaucoup pour l'info Tonic. Je te tiendrais au courant si le problème est résolu après ça smile.gif
Moustik78
De retour BZZZZZZZZZzzzzzzzzzzz

Et bien j'ai essayé d'écarter tous les effets opérants sur mon appli, mais ce message apparait toujours (de temps en temps). La dernière fois il y a quelques minutes, simplement en prenant la fenêtre du navigateur, et en la redimensionnant à tout va. VLAM ! Gros message d'erreur identique à celui du premier post.

@Tonic : tu n'as vraiment plus aucun problème sans les Fades?

Ca me semble en effet être un problème de timing. Certains éléments de la vue ne doivent pas avoir le temps de se mettre en place. J'ai remarqué à un moment, lorsque ce message d'erreur s'affiche, que certaines vues ne sont pas complètes : il manque le détour des TabNavigator, des accordéons, des ComboBox, etc.

Hélas, même les setTimeOut n'y font rien, et ce même si je vais jusqu'à attendre plusieurs minutes pour afficher les vues unes par unes.

Mystère... et booléan icon_mrgreen.gif
Tonic
Non, je n'aie plus ce problème.

J'ai franchement mit du temps à trouver ce qui n'allait pas. Je suis parti d'un projet vide, j'ai mit petit à petit le code, jusqu'à trouver d'où venait le problème.

Donc tu devrais peut être faire pareil, partir de quelque chose de simple, et complexifier, jusqu'a ce que l'erreur apparaisse.
iteratif
Moustik78> Appliques-tu un effet sur des elements lorsque tu les retires de l'affichage ?
Moustik78
@Tonic : Je vais essayer ta méthode, c'est peut être le mieux en effet.

@iteratif : Et bien j'en applique, mais lorsque je retire ces vues de l'affichage, les effets sont bien terminés. J'ai même essayé de les retirer ou de les mettre à end(), mais ça ne change rien :/
Moustik78
Bon, a force de chercher, j'ai peut-être trouvé une piste icon_biggrin.gif (je dis bien peut être, et ça fait un peu rustine je trouve... ^^' )

Bon, j'ai constaté, à force de test, que ce message d'erreur devenait récurrent lors d'une action précise : je clique sur une ligne de mon datagrid, un canvas s'affiche alors à coté de ce dernier avec un effet de resize. Lorsque que je réduit la taille de la fenêtre du navigateur, poum ! L'erreur survint. j'ai alors tenté quelque chose...

Dans le code de ma vue (le Canvas), j'ai ajouté un autoLayout que j'ai mis à false.

CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    autoLayout="false">


Avec juste cet autoLayout de précisé, plus d'erreur (en tout cas, c'est bien l'impression que ça donne).

Mettre l'autoLayout à false apporte pas mal de contrainte, aussi j'ai du jouer dans mes autres scripts à le mettre à true lorsque j'en avais besoin, mais je le laisse le maximum de temps à false.

Pour le moment, tout semble marcher. To be continued... icon_biggrin.gif
Moustik78
Bon et bien finalement, fausse joie, cette fichue erreur est toujours là icon_mad.gif

Ci-joint une copie d'écran.

Comme toujours, l'erreur se provoque lorsque j'agrandis la fenêtre de mon navigateur. Pn voit bien que certains composants graphiques n'ont pas finis de se mettre en place, et tout déborde sur les autres. Etrange... D'autant plus que cette erreur ne survient pas à chaque coup.

Je ne sais pas trop quoi penser. Je pense que je vais directement contacter le support, mais ça m'embête un peu.

J'ai regardé sur le web, voir si quelqu'un d'autre avait cette erreur. J'ai trouvé des posts similaires sur des forums anglophones, mais aucune réponse n'a été donnée :/

icon_cry.gif
Tonic
Salut,

Tu as vraiment essayé en enlevant tout les effets visuels?

Ca vient forcément de ça.

Je n'aie plus ce problème depuis que j'ai enlévé et mieux contrôlé certains effets...
Moustik78
Kikoo Tonic smile.gif

Oui j'ai essayé, et j'avais bien cru que ça allait marcher, mais l'erreur est revenue :/

J'ai remarqué aussi que dans mon message d'erreur, comparé à celui que tu avais posté, il n'y avait aucune mention d'effect ou de quoi que se soit.

Je viens de trouver une question similaire sur un site américain, mais pour voir la réponse, il faut payer. thôôôôôô icon_mad.gif
Tonic
Et cette erreur intervient quand précisement?

T'as pas une démo en ligne pour tester?
Moustik78
Cette erreur intervient aléatoirement, notammement lorsque j'agrandis/réduis la fenêtre de mon navigateur. Les élements semblent se chevaucher, et ne pas se mettre en place correctement.

Hélas, je n'ai pas de version en ligne, et ce projet utilise tout un tas de paramétrages que je ne pourrai poster ici :/

Je vais essayer de voir ça avec le support. Peut-être sauront-ils m'éclairer icon_biggrin.gif

Merci pour ton aide Tonic wink.gif
Tonic
Tu ne gères pas des évènements avec ResizeEvent?

Je pense que tu utilises des évènements qui sont intercpétés et éxécutés en parallèle. Il te faudrait donc être capable de donner un ordre précis à la gestion de tes évènements, pour qu'il s'éxécute séquentillement et non en parallèle.

Et également peut être entourée tes codes par un try/catch...

A tester...

Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.