Exception java.lang erreur

Résolu
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010 - 27 août 2010 à 15:17
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010 - 28 août 2010 à 20:46
Bonjour tout le monde ,

J'ai une exception java.lang.arrayIndexOutOfBoundsException lors de l'execution de mon programme.

J'ai essayer de modifier la condition selon le nombre d'élements que j'ai dans mon vecteur mais rien n'y fait.

Voilà la partie du code qui est concernée.
Vector week=new Vector();
while (rs.next())
{week.add(rs.getString(2);
}
for (int v=0;v<week.size());v++)
{
if (float.parsefloat(week.elementAt(v).toString()==floatparsefloat(week.elementAt(v+1).toString())
S+=S+Float.parsefloat(week.elementAt(v).toString());

else if (float.parsefloat(week.elementAt(v).toString()!=floatparsefloat(week.elementAt(v+1).toString())
{Sum[j]=S;
j++;
}
}
for(int i=0;i<j;i++)
{System.out.println(+Sum[i]);

Merci pour toute réponse^^.
}

11 réponses

HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 août 2010 à 20:37
Pourquoi ne pas faire directement la somme dans la requête SQL en utilisant SUM sur TCONG_D avec un group by sur le champ WEEK ?
Si c'est juste pour récupérer la somme, il n'y a pas forcément besoin de passer par une boucle en java si tu ne réutilises pas les données dans la suite du programme.

Sinon, si tu veux garder la requête SQL de cette façon, passer par une Map qui aurait comme clé la semaine (WEEK), et en valeur la somme devrait résoudre ton problème.

En gros ça pourrait donner quelque chose du style:
Map <String, Float> mapWeek = new HashMap<String, Float>();
while(rs.next()) {
String num = rs.getString(1);
String week = rs.getString(2);
Float value = Float.parseFloat(num);
if (mapWeek.containsKey(week)) {
value += mapWeek.get(week());
}
mapWeek.put(week, value);
}
for (Entry<String, Float> e : mapWeek.entrySet()) {
System.out.println(e.getKey() + ": " + e.getValue());
}



Autres choses :
- Il semble que tu n'utilises pas "tabLignes", enlève de ton code tout ce qui est inutilisé, ça encombre le code et ne permet pas une bonne visibilité.
- Tu peux garder ton code précédent (en ajoutant un "if" sur la valeur de v et de la taille du tableau), mais en préférablement en remplaçant Vector par ArrayList (par exemple), l'usage de Vector est de moins en moins répandu.

Fanny
3
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 août 2010 à 21:24
mapWeek est un objet de type "Map" (plus précisément HashMap dans ce cas).
C'est à dire que ça fonctionne par clé/valeur.

Dans la mesure où tu veux condenser les valeurs de n.TCONG_D pour chaque n.WEEK, une Map te permet d'avoir la semaine en tant que clé, et pour chacune de ses clés, d'y attribuer une valeur. La valeur change donc pour chaque itération de ta boucle sur le resultset.

Imagine que tu aies dans ton resultset les valeurs suivantes :
Semaine 1 | 5
Semaine 2 | 4.1
Semaine 1 | 2.2
Semaine 3 | 2.6
Semaine 2 | 3

Le premier passage de la boucle va vérifier si la Map contient déjà la clé "Semaine 1", ce n'est pas le cas, donc on insère dans la Map une nouvelle paire clé/valeur équivalent à clé : "Semaine 1" et valeur : 5

Second passage de la boucle, la clé "Semaine 2" n'existe pas encore dans la Map, donc même chose, on insère une nouvelle paire clé/valeur : "Semaine 2" -> 4.1

Troisième passage, la clé "Semaine 1" existe dans la Map, donc on fait la somme de la valeur du resultset avec 5 (valeur actuelle pour la clé "Semaine 1"), et ensuite même chose, on met à jour la Map avec "Semaine 1" -> 7.2

Et ainsi de suite.

Donc oui, la value représente la somme selon les week.

La méthode .put() d'une Map ajoute la paire clé/valeur si la clé n'existe pas, sinon elle remplace la clé existante.

Fanny
3
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 août 2010 à 23:13
Lorsque tu as ce genre d'erreur, il faut regarder ce que la méthode retourne.
En l'occurence, entrySet() de l'objet Map retourne un objet de type java.util.Map.Entry.

Soit bien sûre que ce soit cet objet que tu aies dans les imports (et non pas un objet Entry d'un autre type):

import java.util.Map.Entry;


Fanny
3
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
28 août 2010 à 20:46
C'est bon j'ai trouvé la solution ^^,il fallait que j'ajoute un get!

dataset.addValue(Float.parseFloat(NumTotal.get(j).toString()), series1, "WEEK"+j);

Merci pour tout.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 août 2010 à 17:51
Salut,

A priori si la boucle "for" va de 0 à la taille de week.size(), lors du dernier passage dans cette boucle, le week.elementAt(v+1) ne pourra pas exister, d'où l'exception lancée.

Par ailleurs, ya t il une raison particulière pour utiliser un Vector (qui n'est en général plus utilisé maintenant) ?

Fanny
0
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
27 août 2010 à 19:26
Salut,
j'ai utilisé les vecteurs pour stocker des données VARCHAR que j'ai récupéré de la base de donnée.Je dois faire un traitement sur deux colonnes selon la valeur d'une colonne "week".Si c'est le même week, je fais la sommation des valeurs de l'autre colonne.C'est pour ca que je fais la condition if if(Float.parseFloat(week.elementAt(v).toString())==Float.parseFloat(week.elementAt(v+1).toString()))

Je doutais que le dernier indice ne soit pas reconnu,mais je n'ai pas trouver une solution!!

voilà le code tout entier

public static void main(String[] args) {
// TODO Auto-generated method stub
Vector tabLignes=new Vector();
Vector nomCols = new Vector();
Vector week = new Vector();
float Sum[]=new float[100];
int j=0;

{ try { Class.forName ("oracle.jdbc.driver.OracleDriver");
System.out.println("Driver Loaded");
Connection con=DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:xe","SYSTEM","infohouda");
System.out.println("Driver Connected");
Statement st=con.createStatement();
//ResultSet rs=st.executeQuery("select * from KPI_NSN");
ResultSet rs=st.executeQuery("select n.TCONG_D,n.WEEK from KPI_NSN1 n order by n.WEEK");

while(rs.next()) {
//System.out.println(rs.getString(1));
nomCols.add(rs.getString(1));
week.add(rs.getString(2));

}
for (int v=0;v<=week.size();v++)
{
System.out.println(nomCols.elementAt(v).toString());

if(Float.parseFloat(week.elementAt(v).toString())==Float.parseFloat(week.elementAt(v+1).toString()))
{
S=S+Float.parseFloat(nomCols.elementAt(v).toString());
System.out.println(Float.parseFloat(nomCols.elementAt(v).toString()));
}
else if(Float.parseFloat(week.elementAt(v).toString())!=Float.parseFloat(week.elementAt(v).toString()))
{Sum[j]=S;
System.out.println(+Sum[j]);
j++;
}
}
for (int i=0;i<j;i++)
{
System.out.println("la somme des num est "+Sum[1]);
}
st.close();
con.close(); }
catch(Exception e) {
System.out.println(e);
} finally {
System.out.println("it's finally block executed");
}
}
}

Encore Merci .
0
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
27 août 2010 à 21:06
Merci Beaucoup Funny,

Je suis débutante c'est pour cela ^^,juste une question pour la partie
if (mapWeek.containsKey(week)) {
value += mapWeek.get(week());
}
mapWeek.put(week, value);

j'ai pas très bien compris le rôle de mapweek!est ce que value représente la somme de TCONG_D selon les week?

Merci encore.
0
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
27 août 2010 à 23:04
J'ai très bien compris la chose, c'est plus facile , il fait le traitement donc seul selon la clé définit!

une dernière chose Fanny , pour la partie
for (Entry <String, Float> e : mapWeek.entrySet()) {
 	System.out.println(e.getKey() + ": " + e.getValue());
 }

J'ai cherché un peu sur le net , j'ai trouvé que ça concerne la conversion,en essayant de le faire j'ai eu une erreur :

Entry <String, Float> e : mapWeek.entrySet() type mismatch can not convert from element type Map.entry <String,Float> to indexEvents.entry.

Merci Fanny.
0
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
27 août 2010 à 23:25
Merci Infiniment Fanny pour toute ces Informations ^^.

Le problème est résolu grâce à ton aide.
0
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 août 2010 à 23:44
Pas de soucis, n'oublie pas d'accepter une réponse si elle a répondu à ta question (histoire d'y voir plus clair dans la liste des problèmes qui sont posés / résolus).

Fanny
0
orchideor Messages postés 19 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 9 septembre 2010
28 août 2010 à 20:15
Salut Fanny,
voilà j'ai avancé depuis , et j'ai crée un Arraylist ou j'ai stocké les données , ma méthode finale est posté ci dessus.
	public ArrayList getData() throws ClassNotFoundException, SQLException
{
// TODO Auto-generated method stub

 ArrayList list = new ArrayList();




 { try { Class.forName ("oracle.jdbc.driver.OracleDriver");
 System.out.println("Driver Loaded"); 
 Connection con=DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:xe","SYSTEM","infohouda"); 
 System.out.println("Driver Connected"); 
 Statement st=con.createStatement(); 
 //ResultSet rs=st.executeQuery("select * from KPI_NSN"); 
 ResultSet rs=st.executeQuery("select n.TCONG_D,n.WEEK from KPI_NSN1 n order by n.WEEK");

 LinkedHashMap <String, Float> mapWeek = new LinkedHashMap<String, Float>();
 while(rs.next()) {
 	String num = rs.getString(1);
 	String week = rs.getString(2);
 	Float value = Float.parseFloat(num);
 	if (mapWeek.containsKey(week)) {
 		value += mapWeek.get(week);
 	}
 	mapWeek.put(week, value);
 }
 
 for (Entry <String, Float> e : mapWeek.entrySet()) {
 	System.out.println(e.getKey() + ": " + e.getValue());
 	
list.add(e.getValue());
 //	Sum[j]=e.getValue();
 	
 }
 for (int i = 0; i < list.size(); i++)
 {
  Float str = (Float) list.get (i);
     System.out.println (str);
 }


 st.close(); 
 con.close(); } 
 catch(Exception e) {
 System.out.println(e); 
 } finally {
 System.out.println("it's finally block executed");
 }
 }
 
 return  list ;
}
}


Mon problème je l'ai quand j'essaie de récupérer les donnée de mon Array list dans mon servlet.

j'ai l'exception :
java.lang.NumberFormatException: For input string: "[52.0, 45.0, 27.0]"

try {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();

TryTotalNWeekER T=new TryTotalNWeekER();
ArrayList NumTotal=new ArrayList();
NumTotal=T.getData();

for (int j=0;j<T.getData().size();j++)
{

dataset.addValue(Float.parseFloat(NumTotal.toString()), series1, "WEEK"+j);

}
0
Rejoignez-nous