Hashtable la clef ne donne pas l'object
Mon code fonctionne bien sans l’enregistrement, c’est l’hors de l’évolution qu’il me pose problème.
J’ai fait des trais et des dessins que j’ai appeler «*forme*» , ils sont sur plusieurs feuille mais tous enregistrés dans un même Hashtable que seul la clef différencie.
Six feuilles donc
les clef de 0 a 5 représentent les feuilles, leurs objet est le nombre de formes de chaque feuille.
La clef 1.1 est le première forme de la feuille 1,
La clef 1.2 la seconde ect…
La clef 2.1 est le première forme de la feuille 2
ect…
J’ai enregistrer les formes dans un fichier texte, je les extrait sans problème.
Que je passe le Hashtable par référence ou que je les copie d’un Hashtable passer par valeur ne change rien.
Le problème viens quand je veux utiliser le Hashtable , sur le débogueur je retrouve toutes mes formes mais la clef ne me permet pas de récupérer l’objet.
Je suis dépasser je ne comprend pas, si quelqu’un pouvait me dire quel est le problème et me donner une solution.
Le code d’enregistrement et de récupération des formes
Code:
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
package en_forme;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
*
* @author Janosor
*/
public class Enregistrement_forme
{
public void enregistrer (Hashtable hash_forme)
{
ouvrire(hash_forme);
}
public Hashtable extraction()
{
Hashtable hash_forme = new Hashtable();
String str_clef = "";
String str_forme = "";
Stocage sto_tirrage = new Stocage();
try
{
String str_nom = "C:/..
./formes.txt";
FileReader fred_nom_fichier = new FileReader(str_nom);
BufferedReader buf_wrt_forme = new BufferedReader (fred_nom_fichier);
do
{
str_clef = buf_wrt_forme.readLine();
str_forme = buf_wrt_forme.readLine();
hash_forme.put(str_clef,str_forme );
}while (buf_wrt_forme.ready() );//boo_fin != true);
buf_wrt_forme.close();
}
catch (EOFException e)
{
message_erreur( "EOF Exception" + e);
}
catch(java.io.IOError e)
{
message_erreur( "IOErreur" + e);
}
catch (java.io.IOException e)
{
message_erreur(" IOExeption" + e);
}
finally
{
//message_erreur (" finally");
}
return (hash_forme);
}
private void ouvrire(Hashtable hash_forme)//enregistrement
{
try
{
String fr_nom = "C:/
/formes.txt";
FileWriter fwrt_nom_fichier = new java.io.FileWriter(fr_nom);
BufferedWriter buf_wrt_forme = new BufferedWriter (fwrt_nom_fichier);
Iterator toutes_clef;
Iterator toutes_formes;
toutes_clef = (Iterator)hash_forme.keys();
toutes_formes = (Iterator)hash_forme.elements();
while ( (toutes_clef.hasNext()) && (toutes_formes.hasNext()))
{
buf_wrt_forme.write(String.valueOf(toutes_clef.next()));
buf_wrt_forme.newLine();
buf_wrt_forme.write(String.valueOf(toutes_formes.next()));
buf_wrt_forme.newLine();
}
buf_wrt_forme.close();
}
catch (EOFException e)
{
message_erreur( "EOF Exception" + e);
}
catch(java.io.IOError e)
{
message_erreur( "IOErreur" + e);
}
catch (java.io.IOException e)
{
message_erreur(" IOExeption" + e);
}
finally
{
//message_erreur (" finally");
}
}
private void message_erreur(String str_erreur)
{
javax.swing.JFrame Jfr_erreur = new JFrame("Erreur dans extraxion");
Jfr_erreur.setBounds(100, 100, 300, 200);
javax.swing.JTextArea Jtxt_erreur = new JTextArea();
Jtxt_erreur.setText(str_erreur);
Jtxt_erreur.setBounds(20, 20, 200, 100);
Jfr_erreur.add(Jtxt_erreur);
Jfr_erreur.setEnabled(true);
Jfr_erreur.setVisible(true);
}
} |
Code d’utilisation des formes réduit a la portion ou le hachtable est utilisé.
Code:
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
|
//Le hach_forme donne un objet quil faut convertir en String, pour le convertir en int après
String str_nb_f = String.valueOf(hash_forme.get(int_num));
//Lérreure se voie ici car str_nb_f a la valleur null alors que le Hashtable est correcte.
int int_compte_forme = Integer.parseInt(str_nb_f);
//dessin de forme
if (int_compte_forme >=1)
{
//str_clef = (String.valueOf(int_num)+"."+String.valueOf(int_nb_formes[int_num]));
//hash_forme.put(str_clef, new String(str_forme));
//int_nb_formes[int_num]++;
//hash_forme.put(int_num, int_compte_forme);
for (int j = 0; j<=int_compte_forme-1;j++)
{
String clef = (int_num + "." + (j));
String str_poly_forme = String.valueOf(hash_forme.get(clef));
int int_longueur = str_poly_forme.length();
int int_pt_n = str_poly_forme.lastIndexOf("n");
int int_nb_pt = Integer.parseInt(str_poly_forme.substring((int_pt_n +1), int_longueur));
int []tab_int_x = new int[int_nb_pt];
int []tab_int_y = new int[int_nb_pt];
int int_position_x = 0;
int int_position_y = 0;
int int_position_virgule=0;
String str_x;
String str_y;
for ( int i = 1; i<= int_nb_pt;i++)
{
int_position_x =(str_poly_forme.indexOf("x", int_position_y));
int_position_y = (str_poly_forme.indexOf("y", int_position_x));
int_position_virgule = (str_poly_forme.indexOf(",", int_position_y));
str_x = str_poly_forme.substring(int_position_x+1, int_position_y);
str_y = str_poly_forme.substring(int_position_y+1, int_position_virgule);
tab_int_x[i-1] = Integer.parseInt(str_x);
tab_int_y[i-1] = Integer.parseInt(str_y);
}
g.setColor(Color.red);
//g.drawPolygon(tab_int_x, tab_int_y, int_nb_pt);
g.fillPolygon(tab_int_x, tab_int_y, int_nb_pt);
} |
Au départ j’avais fait sa par valeur mais j’avais le même problème, putAll() fonctionnait très bien aussi que je caste ou pas le Map, mais actuellement il n’est pas ulilisé.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public void set_hash(Hashtable hash_fo)
{
//hash_forme.putAll((Map)hash_fo);
Iterator toutes_clef;
Iterator toutes_formes;
toutes_clef = (Iterator)hash_fo.keys();
toutes_formes = (Iterator)hash_fo.elements();
while ( (toutes_clef.hasNext()) && (toutes_formes.hasNext()))
{
hash_forme.put(String.valueOf(toutes_clef.next()), String.valueOf(toutes_formes.next()));
}
} |
J’ai tracer le problème jusqu’à class Hashtable qui ici me renvoi null
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
} |
Merci d'avance a tout ceux qui vont prendre du temps pour mon problème.