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

Langage Java Discussion :

[débutant]IndexOutOfBoundsException non résolvable


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut [débutant]IndexOutOfBoundsException non résolvable
    Bonjour,

    J'essaye de résoudre un IndexOutOfBoundsException mais en vain
    Les points 1 à 5 suivants fonctionnent correctement

    1) Je lance ma commande (execute) pour ajouter un équipement (AddEquipmentOperation)
    Cette commande ajoute l’équipement à l’index 1
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ajout Disjoncteur index 0
    2) Je lance ma commande de suppression (execute) pour supprimer l’équipement ajouté précédemment (DeleteEquipmentOperation)
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    drawingEquipmentList size 1
    drawingEquipmentList get(0) Disjoncteur
    selection size 1
    equipement Disjoncteur indice 0
    suppression Disjoncteur index 0

    3) J’annule (Undo) mon opération de suppression
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Undo Delete => add
    Ajout Disjoncteur index 0

    4) J’annule (Undo) mon opération d’ajout (retour à l’état initial sans équipement)
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Undo Add => delete
    suppresion Disjoncteur index 0
    5) Je refais (Redo) mon opération d’ajout
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Redo Add => add
    Ajout Disjoncteur index 0
    6) Je refais (Redo) mon opération de suppression
    Sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Redo Delete => delete
    drawingEquipment size 1
    drawingEquipment get(0) Disjoncteur
    selection size 1
    equipement Disjoncteur indice -1
    suppresion Disjoncteur index -1
    On peut constater que l'index passe à -1
    La suppression ne fonctionne pas


    7) J’essaye de annuler (Undo) la suppression et j’ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    java.lang.IndexOutOfBoundsException: Index: -1, Size: 1
    	at java.util.ArrayList.add(Unknown Source)
    	at ltmanager.model.Drawing.addDrawingEquipment(Drawing.java:74)
    	at ltmanager.operations.AddDeleteEquipmentHelper.doAddEquipment(AddDeleteEquipmentHelper.java:28)
    	at ltmanager.operations.DeleteEquipmentOperation.undo(DeleteEquipmentOperation.java:104)
    Pour moi l'erreur provient du point 6) mais je ne vois pas où
    DeleteEquipmentOperation
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    public class DeleteEquipmentOperation extends EquipmentOperation {
     
    	private SheetOfManoeuvre sheetOfManoeuvre;
    	private DrawingEquipment [] equipment;
    	private int [] equipmentIndex;
    	private ISelection tableViewerSelection;
     
    	public DeleteEquipmentOperation(String label,IUndoContext undoContext) {
    		super(label,undoContext);
    		//On récupére la fiche de manoeuvre
    		//Récupération de la fenêtre
    		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    		IWorkbenchPage page = window.getActivePage();
    		this.sheetOfManoeuvre = Activator.getDefault().getSheetOfManoeuvre();
    		// Récupération du tableau d'équipements
    		DrawingEquipmentTableView tableView = (DrawingEquipmentTableView) page
    				.findView(DrawingEquipmentTableView.ID);
    		// Récupération de la sélection courante du tableau d'équipement
    		tableViewerSelection = tableView.getViewer().getSelection();
    	}
     
    	/**
             * Execution de l'opération
             * Suppresion de l'équipement de la fiche de manoeuvre
             */
    	@Override
    	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
     
    		if (tableViewerSelection instanceof IStructuredSelection) {
    		    //Récupération de la liste des équipments du schéma
    		    List<DrawingEquipment> drawingEquipmentList = this.sheetOfManoeuvre.getDrawing().getDrawingEquipment();
    		    System.out.println("drawingEquipmentList size "+drawingEquipmentList.size());
    		    System.out.println("drawingEquipmentList get(0) "+drawingEquipmentList.get(0).getName());
    		    System.out.println("selection size "+((IStructuredSelection) tableViewerSelection).toList().size());
    			// si nous avons au moins un équipement
    			if (!drawingEquipmentList.isEmpty()) {				
    			    //Création d'un dictionnaire qui classifie les équipements
    			    //à supprimer dans l'ordre ascendant de
    			    //leur indice dans le schéma
    			    Map<Integer, DrawingEquipment> sortedMap = new TreeMap<Integer, DrawingEquipment>();
    			    for(Object item : ((IStructuredSelection) tableViewerSelection).toList()){
    					if (item instanceof DrawingEquipment) {
    						  	//Chaque item est un equipement de la librairie
    							DrawingEquipment equipment = (DrawingEquipment) item;
    							System.out.println("equipement "+equipment.getName()+ " indice "+drawingEquipmentList.indexOf(equipment));
    							sortedMap.put(drawingEquipmentList.indexOf(equipment), equipment);
    			            }
    				}
    			    //Récupération des équipements à supprimer
    			    //dans l'ordre de leur indice
    			    equipment  = sortedMap.values().
    			        toArray(new DrawingEquipment [sortedMap.size()]);
    			    //Création du tableau des indices croissants
    			    //des équipments à supprimer
    			    equipmentIndex = new int [equipment.length];
    			    int i = 0;
    			    for (int index : sortedMap.keySet()) {
    			    	equipmentIndex [i++] = index; 
    			    }
    			    //suppression des équipements
    			    AddDeleteEquipmentHelper.doDeleteEquipment(this.sheetOfManoeuvre,equipment);
    			}
    		}
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		//Ajout des équipements supprimés
     
    		try {
    			System.out.println("Undo Delete => add");
    			AddDeleteEquipmentHelper.doAddEquipment(this.sheetOfManoeuvre,equipment, equipmentIndex);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		System.out.println("Redo Delete => delete");
    		//sélection des équipements qui étaient sélectionnées avant la suppression
            sheetOfManoeuvre.getDrawing().setSelectedItems(Arrays.asList(equipment));
    		//re-suppression des équipements
    		return execute(monitor, info);
    	}
    }
    Ca fait un moment que je cherche à débugger mais je ne comprend pas d'où vient mon erreur.

    D'avance merci pour votre aide

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Ajoute un contrôle dans ton code que si l'index est égal à 0 tu ne fais rien

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Par défaut
    possible que ton undo sélectionne un element qui n'existe plus?

  4. #4
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Alexandre>je n'aurai plus l'erreur mais cela ne fonctionnera pas mieux

    titoum> justement, j'y ai pensé mais j'ai insérer des sorties vers la console pour vérifié.Avant de mettre mes équipements dans le Map, j'ai les bon index, lorsque je fais une boucle pour insérer mes équipements dans mon Map, l'index se retrouve à -1

    merci pour votre aide

  5. #5
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Un retour de indexOf à -1 signifie que ton Equipment n'est pas dans la liste !
    Il y a dé-corrélation entre drawingEquipmentList et tableViewerSelection, les traces montrent bien que cette liste contient 1 élément au point 6, mais ce n'est pas le même que dans la table ! Il faudrait tracer aux actions suivantes les 2 ensembles, par exemple en affichant leur hashcode...

    ____________________________________
    Citation Envoyé par *alexandre* Voir le message
    Ajoute un contrôle dans ton code que si l'index est égal à 0 tu ne fais rien
    Ignorer une erreur n'est pas la corriger !

  6. #6
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 584
    Par défaut
    Bingo !!
    le point 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Undo Add => delete
    suppresion 11737975 index 0
    le point 5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Redo Add => add
    ajout 9383078 index 0
    le point 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Redo Delete => delete
    drawingEquipmentList size 1
    drawingEquipmentList get(0) 9383078
    selection size 1
    equipement 11737975 indice -1
    suppresion 11737975 index -1
    J'ai deux équipements différents !!! 11737975 et 9383078
    Donc mon problème vient du point 5 soit la méthode Redo de AddEquipmentOperation

    merci pour ton aide....Je cherchais pas au bon endroit

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

Discussions similaires

  1. [XSLT][Débutant]XPATH non reconnu par PHP5
    Par fredrik dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/09/2006, 13h13
  2. [JDBC][Débutant] Caractère non valide
    Par mavina dans le forum JDBC
    Réponses: 5
    Dernier message: 24/07/2006, 14h54
  3. [Débutant] Enregistrement non souhaité.
    Par Monsieur Peck dans le forum Access
    Réponses: 1
    Dernier message: 11/06/2006, 15h40
  4. Réponses: 16
    Dernier message: 01/06/2006, 22h37
  5. [Débutant] JTable non editable+DocumentListener
    Par nicotine002 dans le forum Composants
    Réponses: 9
    Dernier message: 04/01/2006, 01h48

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