Problème de Vecteurs

Fermé
Pieteurre - 1 mars 2016 à 11:05
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 2 mars 2016 à 20:29
Bonjour,

Je débute un peu en Java et je suis actuellement en stage. Le but de ce dernier est d'extraire des données précises de deux fichiers Excel via l'API JExcel et de les rassembler dans un seul et même fichier. Pour contenir toutes ces données extraites, j'utilise des Vecteurs. Voici mon code :



public void actionPerformed(ActionEvent e)
{

//Déclaration des variables

Workbook workbookConso;
Workbook workbookTypeCpt;
Sheet feuilleConso;
Sheet feuilleTypeCpt;

WritableWorkbook workbookEcriture;
WritableSheet feuille820;
WritableSheet feuilleAutres;

Vector<String> referenceConso;
Vector<String> referenceTypeCpt;
Vector<String> nomPrenom;
Vector<String> typeCpt;
Vector<String> conso;

Cell cellule;
Label label;
int tailleVecteurs;
int index;

//Instanciation des variables

workbookConso = null;
workbookTypeCpt = null;
workbookEcriture = null;

referenceConso = new Vector<String>();
referenceTypeCpt = new Vector<String>();
nomPrenom = new Vector<String>();
typeCpt = new Vector<String>();
conso = new Vector<String>();

try
{

workbookConso = Workbook.getWorkbook(new File("Chemin\\NomFichier1"));
workbookTypeCpt = Workbook.getWorkbook(new File("Chemin\\NomFichier2"));
feuilleConso = workbookConso.getSheet(0);
feuilleTypeCpt = workbookTypeCpt.getSheet(0);

for(int i = 0; i <= 38928; i++)
{

cellule = feuilleConso.getCell(1, i + 3);
referenceConso.addElement(cellule.getContents());
System.out.println(referenceConso.get(i));

cellule = feuilleConso.getCell(8, i + 3);
conso.addElement(cellule.getContents());
System.out.println(conso.get(i));

System.out.println("Ligne : " + (i + 4));
System.out.println();

}

for (int i = 0; i <= 42794; i++)
{

cellule = feuilleTypeCpt.getCell(2, i + 2);
referenceTypeCpt.addElement(cellule.getContents());
System.out.println(referenceTypeCpt.get(i));

cellule = feuilleTypeCpt.getCell(3, i + 2);
nomPrenom.addElement(cellule.getContents());
System.out.println(nomPrenom.get(i));

cellule = feuilleTypeCpt.getCell(14, i + 2);
typeCpt.addElement(cellule.getContents());
System.out.println(typeCpt.get(i));

System.out.println("Ligne : " + (i + 3));
System.out.println();

}
}
//Gestion des erreurs
catch (IOException e1)
{
e1.printStackTrace();
}
catch (BiffException e1)
{
e1.printStackTrace();
}
finally
{
if (workbookConso != null)
{
//Fermeture du workbook
workbookConso.close();
}

if (workbookTypeCpt != null)
{
//Fermeture du workbook
workbookTypeCpt.close();
}
}

//Instanciation de la taille + détermine le plus grand des vecteurs référence
if (referenceConso.size() > referenceTypeCpt.size())
{
tailleVecteurs = referenceConso.size();
}
else
{
tailleVecteurs = referenceTypeCpt.size();
}

try
{
//Création d'un objet Workbook
workbookEcriture = Workbook.createWorkbook(new File("Chemin\\NomFichierEcriture"));

//Création d'une nouvelle feuille "820" en première position
feuille820 = workbookEcriture.createSheet("820", 0);

//Création d'une nouvelle feuille "Autres" en deuxième position
feuilleAutres = workbookEcriture.createSheet("Autres", 1);

//Remplissage des cellules des colonnes "Référence", "NOM Prénom" et "Conso" avec le contenu des vecteurs via une boucle
for(int i = 0; i <= tailleVecteurs; i++)
{

while (referenceConso.get(i).equals(referenceTypeCpt.get(i)))
{

index = referenceConso.indexOf(i);

if (typeCpt.get(i).equals("820"))
{

label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuille820.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuille820.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuille820.addCell(label);

System.out.println("Ligne : " + i + 3);

}

else
{

label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuilleAutres.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuilleAutres.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuilleAutres.addCell(label);

System.out.println("Ligne : " + i + 3);

}

/* label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuille820.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuille820.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuille820.addCell(label);

label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuilleAutres.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuilleAutres.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuilleAutres.addCell(label);

System.out.println("Ligne : " + i + 3); */
}

}

//Création des entêtes des colonnes de la feuille des 820
label = new Label(0, 2, "Référence du site");
feuille820.addCell(label);

label = new Label(1, 2, "NOM Prénom");
feuille820.addCell(label);

for(int i = 1; i <= 15; i++)
{
if(i > 10)
{
label = new Label(i + 1, 1, "20" + i);
feuille820.addCell(label);
}
else
{
label = new Label(i + 1, 1, "200" + i);
feuille820.addCell(label);
}

label = new Label(2, 2, "Conso avec déductions sur 365 jours");
feuille820.addCell(label);
}

//Création des entêtes des colonnes de la feuille des autres compteurs
label = new Label(0, 2, "Référence du site");
feuilleAutres.addCell(label);

label = new Label(1, 2, "NOM Prénom");
feuilleAutres.addCell(label);

for(int i = 1; i <= 15; i++)
{
if(i > 10)
{
label = new Label(i + 1, 1, "20" + i);
feuilleAutres.addCell(label);
}
else
{
label = new Label(i + 1, 1, "200" + i);
feuilleAutres.addCell(label);
}

label = new Label(2, 2, "Conso avec déductions sur 365 jours");
feuilleAutres.addCell(label);
}

//Ecriture du workbook
workbookEcriture.write();

}
catch (IOException e1)
{
e1.printStackTrace();
}
catch (RowsExceededException e1)
{
e1.printStackTrace();
}
catch (WriteException e1)
{
e1.printStackTrace();
}
finally
{
if(workbookEcriture != null)
{
//Fermeture du workbook
try
{
workbookEcriture.close();
}
catch (WriteException e1)
{
e1.printStackTrace();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
}


Certes, c'est long et c'est pourquoi je vais résumer ce à quoi il est supposé servir.
Je dois rassembler des données ayant pour point commun un matricule de référence. Il existe dans les deux fichiers "lecture" (les fichiers dont j'extrais les données) sachant que ce matricule est contenu dans le vecteur "referenceTypeCpt" pour le premier fichier et dans le vecteur "referenceConso" pour le second. Il s'agit de matricules de compteurs d'eau.
Je dois également récupérer les noms et prénoms du propriétaire des compteurs (dans "nomPrenom"), le type de compteur dont il s'agit (dans "typeCpt") et de leur consommation annuelle (dans "conso").
Le but est donc d'écrire toutes ces données dans un fichier "écriture" où s'alignent le matricule, le nom/prénom, la consommation annuelle (pour le moment sur une seule année, ça sera déjà bien) le tout diviser et trier en deux feuilles, une qui contient tous les "820" (c'est un type de compteur) et une autre qui contient tous les autres types.

Le problème étant que je tombe sur cette série d'erreur :



Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementData(Unknown Source)
at java.util.Vector.get(Unknown Source)
at Appli$6.actionPerformed(Appli.java:514)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


Je comprend bien la nature de la première erreur (je suis hors des dimensions d'un de mes vecteurs, mais je n'arrive pas à savoir lequel) mais la suite m'est assez obscure. Je suis donc à présent bloqué. Si jamais, je peux fournir d'autres informations ou encore la structure des fichiers Excels "lecture" mais je ne suis pas sûr que cette dernière soit nécessaire à l'identification de mon erreur. Je sens venir le truc très très con d'ailleurs.

Bref, merci d'avance, au moins pour avoir eu le courage de lire ce pavé.
A voir également:

1 réponse

KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
1 mars 2016 à 20:10
Bonjour,

 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementData(Unknown Source)
at java.util.Vector.get(Unknown Source)
at Appli$6.actionPerformed(Appli.java:514)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at ...


Je comprend bien la nature de la première erreur (je suis hors des dimensions d'un de mes vecteurs, mais je n'arrive pas à savoir lequel) mais la suite m'est assez obscure.

La stack montre tout les appels effectués pour arriver au morceau de code qui pose problème, donc chaque "at" correspond à la méthode d'où vient l'appel, et si tu vas tout en bas tu auras ton point d'entrée du thread (l'EDT dans ton cas)

Si on lit juste l'extrait que j'ai copié on voit que tu as fait une action (fireActionPerformed) que celle ci est traitée par un ActionListener (Action$6), qui à la ligne 514 appelle la méthode get avec le paramètre -1.

Avec toutes ces informations il est facile de reproduire le problème et avec des points d'arrêt au bon endroit de faire un debogage efficace.
0
Bonjour et merci de ta réponse.

Je me doutais bien que mon erreur se trouvait à la ligne indiquée, cependant, même en sachant cela je n'ai pas réussi à comprendre mon erreur.

Qui plus est, je ne sais pas si c'est moi qui suis pas très doué ou si mon Eclipse déconne, mais j'ai essayé de disperser des points d'arrêts (ou breakpoints, j'ai Eclipse en anglais) mais le programme n'en a pas tenu compte, et je suis certain de ne pas avoir exécuté mon programme de manière à ne pas en tenir compte.

Au passage c'est le contenu de mon "while" qui semble poser problème. Plus précisément la première ligne du "else" (en gras souligné dans le code) :


while (referenceConso.get(i).equals(referenceTypeCpt.get(i)))
{

index = referenceConso.indexOf(i);

if (typeCpt.get(i).equals("820"))
{

label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuille820.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuille820.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuille820.addCell(label);

System.out.println("Ligne : " + i + 3);

}

else
{

label = new Label(0, i + 3, referenceTypeCpt.get(index));
feuilleAutres.addCell(label);

label = new Label(1, i + 3, nomPrenom.get(index));
feuilleAutres.addCell(label);

label = new Label(2, i + 3, conso.get(index));
feuilleAutres.addCell(label);

System.out.println("Ligne : " + i + 3);

}
}
0
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
2 mars 2016 à 20:29
Si la ligne 514 où est l'erreur est celle que tu as soulignée, le get(-1) que tu fais est à cause de la variable index qui vaut -1.

Quand on regarde où elle est déclarée il y a effectivement une erreur.

referenceConso = new Vector<String>();
int i;
index = referenceConso.indexOf(i);

Que fait indexOf ? Il suffit de regarder la documentation : int indexOf(Object)
Returns the index of the first occurrence of the specified element in this vector, or -1 if this vector does not contain the element.
En gros tu as une liste de String et tu cherches dedans un objet int...
Forcément, il ne le trouve pas donc il te renvoie -1

Remarque : pour que Eclipse prenne en compte les points d'arrêt il faut démarrer le programme en mode debug. Menu run (ou clic droit sur ton code), debug as.
0