Jump to content

Étrange problème avec un ArrayList


alvinm93

Recommended Posts

Bonjour tout le monde!

J'ai un problème étrange avec mon ArrayList d'un objet personnalisé

public ArrayList<MonObject> getXMLResult(){
	mObjectList = new ArrayList<MonObject>();
	try {
           // creates and returns new instance of SAX-implementation:
           SAXParserFactory factory = SAXParserFactory.newInstance();

           // create SAX-parser...
           SAXParser parser = factory.newSAXParser();
           // .. define our handler:
           MonHandler handler = new MonHandler();

           // and parse:
           parser.parse("file:///sdcard/fichierxml.xml", handler);

       } catch (Exception ex) {
           ex.printStackTrace(System.out);
       }
       return mObjectList;
}
private static final class MonHandler extends DefaultHandler {
    	private String lastElement = "null";
       	static MonObject actualObject = new MonObject();

        // invoked when document-parsing is started:
        public void startDocument() throws SAXException {
            System.out.println("Document processing started");

        }

        // notifies about finish of parsing:
        public void endDocument() throws SAXException {
            for(int i = 0; i<mObjectList.size();i++){
		MonObject focusedObject = mObjectList.get(i);
		System.out.println(focusedObject.getName());
	    }
            System.out.println("Document processing finished");
        }

        // we enter to element 'qName':
        public void startElement(String uri, String localName, 
                String qName, Attributes attrs) throws SAXException {
            if (qName.equals("maintag")) {

            } else if (qName.equals("MonObject")) {
            	actualObject = new MonObject();
            	actualObject.setName(attrs.getValue("name"));
            	mObjectList.add(actualObject);
            /* if (...)
                        } */ else {
                throw new IllegalArgumentException("Element '" + 
                        qName + "' is not allowed here");
                        }
            setLastElement(qName);
        }

        // we leave element 'qName' without any actions:
        public void endElement(String uri, String localName, String qName)
        throws SAXException {
            // do nothing;
        }

		public void setLastElement(String lastElement) {
			this.lastElement = lastElement;
		}

		public String getLastElement() {
			return lastElement;
		}
    }

Mais les System.out de la boucle donnent

object2

object2

object2

au lieu de donner

object0

object1

object2

Pourtant juste avant de l'ajouter dans l'arraylist je fais un MonObject.getName() j'obtient le nom correct

Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier.

Si au lieu de faire un ArrayList de MonObject je fais un arraylist de String là sa marche mais c'est pas le but car j'ai plusieurs variables puis plus tard une liste dans une liste à retourner.

Quelqu'un aurait une solution?

Link to comment
Share on other sites

Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier.

C'est logique puisque ton objet "actualObject" est déclaré static donc c'est une instance de classe donc unique pour ta classe.

Quelqu'un aurait une solution?

En enlevant static ça devrait fonctionner.

MonObject actualObject = new MonObject();

Link to comment
Share on other sites

public ArrayList<MonObject> getXMLResult(){
               mObjectList = new ArrayList<MonObject>();
               try {
           // creates and returns new instance of SAX-implementation:
           SAXParserFactory factory = SAXParserFactory.newInstance();

           // create SAX-parser...
           SAXParser parser = factory.newSAXParser();
           // .. define our handler:
           MonHandler handler = new MonHandler();

           // and parse:
           parser.parse("file:///sdcard/fichierxml.xml", handler);

       } catch (Exception ex) {
           ex.printStackTrace(System.out);
       }
       return mObjectList;
       }
private final class MonHandler extends DefaultHandler {
               private String lastElement = "null";
               MonObject actualObject = new MonObject();

               // invoked when document-parsing is started:
               public void startDocument() throws SAXException {
                   System.out.println("Document processing started");

               }

               // notifies about finish of parsing:
               public void endDocument() throws SAXException {
                   for(int i = 0; i<mObjectList.size();i++){
                       MonObject focusedObject = mObjectList.get(i);
                       System.out.println(focusedObject.getName());
                   }
                   System.out.println("Document processing finished");
               }

               // we enter to element 'qName':
               public void startElement(String uri, String localName, 
                       String qName, Attributes attrs) throws SAXException {
                   if (qName.equals("maintag")) {

                   } else if (qName.equals("MonObject")) {
                       actualObject = new MonObject();
                       actualObject.setName(attrs.getValue("name"));
                       mObjectList.add(new MonObject(actualObject));
                   /* if (...)
                               } */ else {
                       throw new IllegalArgumentException("Element '" + 
                               qName + "' is not allowed here");
                               }
                   setLastElement(qName);
               }

               // we leave element 'qName' without any actions:
               public void endElement(String uri, String localName, String qName)
               throws SAXException {
                   // do nothing;
               }

                       public void setLastElement(String lastElement) {
                               this.lastElement = lastElement;
                       }

                       public String getLastElement() {
                               return lastElement;
                       }
           }

Merci mais le problème est toujours présent, j'ai enlevé le static dans la déclaration de actualObject, j'ai même testé en l'enlevant dans la déclaration de la class du handler, et pour éviter un problème de passage par référence j'ai créer dans la classe MonObject un constructeur qui va copier les variables "new MonObject(actualObject);"

Là je ne trouve vraiment pas le problème

Link to comment
Share on other sites

Effectivement bizarre. Peux tu donner le code de ta classe MonObject ... j'imagine qu'elle n'est pas statique ;)

et un exemple de ton fichier xml.

Ainsi je le lancerai chez moi pour voir ça.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...