IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Jlist : clear() déclenche une java.lang.ArrayIndexOutOfBoundsException


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut Jlist : clear() déclenche une java.lang.ArrayIndexOutOfBoundsException
    Bonjour,

    dans mon programme java lorsque je clique sur un bouton de mon interface je lis un fichier XML et une JList() est remplie avec les valeurs d'un attribut "id" des noeuds "script" de mon fichier XML.

    Pour éviter d'avoir des noeuds redondants chaque fois que je clique sur le bouton, je cherche à vider le contenu de cette JList. Mais malheureusement, cela déclenche une java.lang.ArrayIndexOutOfBoundsException
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    private DefaultListModel<String> lm = new DefaultListModel<>();
    private JList<String> jListID = new JList<>();
     
       private void display(Node node) 
        {
            displayNode(node);
            if (node.hasChildNodes()) 
            {
                NodeList children = node.getChildNodes();
                for (int i = 0; i < children.getLength(); i++) 
                {
                    display(children.item(i));
                }
            }
        }
     
        private void displayNode(Node node) 
        {       
            if (node!=null)
            {
                if (node.getNodeName().equals("script"))
                {
                    nodeList.add(node);
                }
            }
     
        }
     
        /**
         * Lecture du fichier XML
         */
        public void readXMLFile()
        {
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder parser = factory.newDocumentBuilder();
    		Node document = parser.parse(INPUT_FILE);
     
    		display(document);
     
    		lm.clear();  // suppression du contenu de la liste => Exception 
     
    		setElements();   // mise à jour du contenu de la liste            
        }
     
        /**
         * 
         * @param nodeList 
         */
        private void setElements()
        {        
    		for (Node n : nodeList)
    		{
    			lm.addElement( n.getAttributes().getNamedItem("id").getNodeValue() );
     
    		}     
            jListID.setModel(lm);
        }


    J'ai remarqué que cette exception est levée si un des éléments est sélectionné. Si j'ajoute un jListID.clearSelection() avant le lm.clear(), l'exception se déclenche sur le clearSelection().

    Voici l'exception
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:371)
    at java.util.ArrayList.get(ArrayList.java:384)
    at monApplication.MaClasse$1.valueChanged(MaClasse.java:55)
    at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
    at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
    at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:677)
    at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(BasicListUI.java:2601)
    at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179)
    at javax.swing.DefaultListModel.clear(DefaultListModel.java:510)
    at monApplication.MaClasse.readXMLFile(MaClasse.java:134)
    Comment sortir de cette impasse ?

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    J'ai trouvé mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            jListID.addListSelectionListener(new ListSelectionListener()
            {
                @Override
                public void valueChanged(ListSelectionEvent e) 
                {
                    int i;
                    i = ((JList)e.getSource()).getSelectedIndex();
                    System.out.println(nodeList.get(i).getNodeValue());
                }
            });
    lorsque je fais un clear() l'événement ListSelection() est déclenché et comme i vaut -1 dans ce cas nodeList.get(i) lève l'exception.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Citation Envoyé par Auteur Voir le message
    J'ai trouvé mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            jListID.addListSelectionListener(new ListSelectionListener()
            {
                @Override
                public void valueChanged(ListSelectionEvent e) 
                {
                    int i;
                    i = ((JList)e.getSource()).getSelectedIndex();
                    System.out.println(nodeList.get(i).getNodeValue());
                }
            });
    lorsque je fais un clear() l'événement ListSelection() est déclenché et comme i vaut -1 dans ce cas nodeList.get(i) lève l'exception.
    Effectivement !
    ça n'était pas facile à voir... surtout pour nous ;-)

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    Effectivement !
    ça n'était pas facile à voir... surtout pour nous ;-)
    Je ne me doutais pas que le clearSelection() provoquait l'événement ListSelection c'est pourquoi je n'ai pas posté le code.

    A la lecture du message d'erreur, je n'avais pas compris le
    at monApplication.MaClasse$1.valueChanged(MaClasse.java:55)
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. java.lang.ArrayIndexOutOfBoundsException : 0
    Par kaiser59 dans le forum Général Java
    Réponses: 4
    Dernier message: 12/09/2009, 22h23
  2. Erreur java lang.ArrayIndexOutOfBoundsException
    Par lerorodu51 dans le forum NetBeans
    Réponses: 8
    Dernier message: 04/06/2009, 19h17
  3. Réponses: 4
    Dernier message: 17/11/2007, 15h29
  4. [XSLT] java.lang.ArrayIndexOutOfBoundsException sur Transformation XSLT
    Par SONY30 dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 11/12/2006, 16h59
  5. Réponses: 4
    Dernier message: 30/07/2006, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo