Bonjour,
Voila, apres avoir appris à utiliser correctement les ListIterator, je suis confronté un une sorte de dépassement de liste, que je n'arrive pas à expliquer...
Voila le morceau de code concerné :
A l'execution, voila ce que la console contient :
Code : 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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 //methode qui supprime une face de maniere autonome (sans appeller // les destructeurs des edges et vertex ) public void removeFace(face f) { System.out.println("Begin Removeface"); if(f == null) return; //on récupere les 3 points de la face vertex[] v = this.getFaceVertices(f); System.out.println("face composée des vertex : "+v[0].getId()+" "+v[1].getId()+" "+v[2].getId()); if(v == null) return; //pour chaque vertex System.out.println("Debut boucle for i"); for(int i=0 ; i<v.length ; i++) { LinkedList v_edges = v[i].getEdgeList(); ListIterator it = v_edges.listIterator(); System.out.println("Vertex "+(i+2)+" relié à "+v_edges.size()+" edges"); //pour chaque arrete System.out.println("boucle : "+v_edges.size()+" tours"); while(it.hasNext()) { System.out.println("Tour"); edge e= (edge)(it.next()); System.out.println("Pour edge "+e.getId()); //si l'une des faces est vide et l'autre = face courante if( ((f.equals((e.getFaces())[0])) && ((e.getFaces())[1]== null)) || ((f.equals((e.getFaces())[1])) && ((e.getFaces())[0]== null)) ) { //on ote e du maillage this.dest_edge(e); } else if (f.equals((e.getFaces())[0])) { // on ote f de la liste des faces de e e.setFaces(null, (e.getFaces())[1]); } else if (f.equals((e.getFaces())[1])) { //on ote f de la liste des faces de e e.setFaces(null, (e.getFaces())[0]); } System.out.println("fin edge"); }//fin pour chaque arrete if(v[i].getEdgeList().size() == 0) { //on ote le point du maillage this.dest_vertex(v[i]); } }// end for i (vertex) //on ote la face du maillage this.faces.remove(f); } }
Si on regarde de plus pres, on prévoit 4 tours de boucle, et on compte 5 fois le mot "Tour"...Begin Removeface
face composée des vertex : 2 3 4
Debut boucle for i
Vertex 2 relié à 4 edges
boucle : 4 tours
Tour
Pour edge 2
fin edge
Tour
Pour edge 3
fin edge
Tour
Pour edge 4
fin edge
Tour
Pour edge 6
fin edge
Tour
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at maillage.removeFace(maillage.java:313)
at maillage_main.main(maillage_main.java:26)
Alors heuuu faille ? ou erreur humaine ? car là apres quelques heures là dedans, je commence à n'y plus rien voir.
Merci.
Partager