Exception java.lang erreur [Résolu]

orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 27 août 2010 à 15:17 - Dernière réponse : orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention
- 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^^.
}
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
HFanny 699 Messages postés mercredi 19 février 2003Date d'inscription 13 mai 2011 Dernière intervention - 27 août 2010 à 20:37
3
Merci
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

Merci HFanny 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de HFanny
Meilleure réponse
HFanny 699 Messages postés mercredi 19 février 2003Date d'inscription 13 mai 2011 Dernière intervention - 27 août 2010 à 21:24
3
Merci
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

Merci HFanny 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de HFanny
Meilleure réponse
HFanny 699 Messages postés mercredi 19 février 2003Date d'inscription 13 mai 2011 Dernière intervention - 27 août 2010 à 23:13
3
Merci
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

Merci HFanny 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de HFanny
Meilleure réponse
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 28 août 2010 à 20:46
3
Merci
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.

Merci orchideor 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de orchideor
HFanny 699 Messages postés mercredi 19 février 2003Date d'inscription 13 mai 2011 Dernière intervention - 27 août 2010 à 17:51
0
Merci
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
Commenter la réponse de HFanny
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 27 août 2010 à 19:26
0
Merci
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 .
Commenter la réponse de orchideor
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 27 août 2010 à 21:06
0
Merci
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.
Commenter la réponse de orchideor
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 27 août 2010 à 23:04
0
Merci
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.
Commenter la réponse de orchideor
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 27 août 2010 à 23:25
0
Merci
Merci Infiniment Fanny pour toute ces Informations ^^.

Le problème est résolu grâce à ton aide.
Commenter la réponse de orchideor
HFanny 699 Messages postés mercredi 19 février 2003Date d'inscription 13 mai 2011 Dernière intervention - 27 août 2010 à 23:44
0
Merci
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
Commenter la réponse de HFanny
orchideor 19 Messages postés vendredi 6 novembre 2009Date d'inscription 9 septembre 2010 Dernière intervention - 28 août 2010 à 20:15
0
Merci
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);

}
Commenter la réponse de orchideor

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.