Générer des noms d'objets

Générer des noms d'objets - Java - Programmation

Marsh Posté le 15-03-2008 à 16:09:54    

Bonjour,
 
J'ai une petite question:
 
J'aimerais que mon programme en java puisse générer des noms d'objets pour pouvoir après faire ceci:
 
Student E001 = new Student();
Student E002 = new Student();
Student E003 = new Student();
...
 
Donc en fait j'aurais un String matricule = E001.
J'utilise une méthode pour qu'il passe à matricule = E002.
Mais après je ne peux pas faire Student matricule = new Student(); !
 
Vous avez une idée de comment faire pour qu'il accepte le Exxx que le programme créera?
 
Merci d'avance,
Renaud.

Reply

Marsh Posté le 15-03-2008 à 16:09:54   

Reply

Marsh Posté le 15-03-2008 à 16:10:56    

et si tu utilisais plutot un vector , ou une hashtable pour stocker tes Student ?


Message édité par flo850 le 15-03-2008 à 16:11:25

---------------

Reply

Marsh Posté le 15-03-2008 à 16:19:31    

Ha ^^ je n'ai pas encore vu ça au cours!

 

Je vais faire une petite recherche google là-dessus. Je repasserai si je ne m'en sort pas!

 

Merci  ;)

 

edit: j'pense que j'vais utiliser le hashtable, ça me paraît bien :D


Message édité par MrRenaud le 15-03-2008 à 17:15:07
Reply

Marsh Posté le 17-03-2008 à 16:09:30    

Ni Vector, ni Hashtable, qui sont obsolètes depuis Mathusalem (à l'échelle de l'histoire de Java). Autant prendre les bonnes habitudes dès le début, alors utilise plutôt ceci :

Code :
  1. Map etudiants = new HashMap();

ou

Code :
  1. List etudiants = new ArrayList();

Reply

Marsh Posté le 17-03-2008 à 17:20:24    

Bonjour,
 
J'ai regardé un peu le tableau HasMap et ça me paraît bien.
 
Comme vous avez été plusieurs à me répondre, j'en profite pour vous poser une autre question:
 
En fait, je dois faire un projet (gestion d'une université, etc etc, j'vous passe tous les détails...).  
Ce que je voulais, c'est que lorsqu'on crée un compte pour se loguer sur le programme, le compte ait un identifiant (matricule) différent à chaque fois, et qui commence par une lettre pour préciser le type de compte (Exemple: T pour Teacher, A pour Admin, etc).
 
J'ai donc créé une classe Matricule qui me retourne un String:
 

Code :
  1. import java.io.*;
  2. import java.io.IOException;
  3. /** Classe permettant de retenir et de  
  4.     calculer le matricule suivant pour
  5.     un compte.
  6. */
  7. public class Matricule
  8. {
  9.     private String _statute;
  10.    
  11.     /** Constructeur  
  12.           @param statute le type de compte qui a besoin d'un matricule.
  13.     */
  14.     public Matricule(String statute)
  15.     {
  16. _statute = statute;
  17. boolean success = false;
  18. try
  19.     {
  20.  File file = new File("SchoolOrganizer/Database/LastAssignedMatricule/" + _statute + ".txt" );
  21.  success = file.createNewFile();  // Tente de créer un fichier .txt portant le nom du type de compte (Admin, Teacher, Student, etc...) et retourne true si le fichier n'existe pas encore.
  22.     }                                             
  23. catch (IOException e) { }
  24. if(success)  // Si success = true, c'est que le constructeur est appelé pour la première fois avec ce paramètre.
  25.     {
  26.  try     // Dans ce cas, il ouvre le fichier et y met la valeur de base: 0000
  27.      {
  28.   BufferedWriter outfile =
  29.       new BufferedWriter(new FileWriter("SchoolOrganizer/Database/LastAssignedMatricule/" + _statute + ".txt" ));
  30.   outfile.write("0000" );
  31.   outfile.close();
  32.      }
  33.  catch (IOException e) { }
  34.     }
  35.     }
  36.    
  37.     /** Cherche le matricule suivant pour
  38. un type de compte.
  39.     */
  40.     public String nextMatricule()
  41.     {
  42. String previousMatricule;
  43. String matricule;
  44. try
  45.     {
  46.  BufferedReader infile =
  47.      new BufferedReader(new FileReader("SchoolOrganizer/Database/LastAssignedMatricule/" + _statute + ".txt" ));
  48.  previousMatricule = infile.readLine();  // Prend le numéro sauvegardé dans le fichier.
  49.  infile.close();
  50.     }
  51. catch (IOException e) { }
  52.        // Bout de code pour récuper un matricule à quatre chiffres.
  53. int newMatricule = Integer.parseInt(previousMatricule) + 1;
  54. if(newMatricule <= 9)
  55.     matricule = "000" + Integer.toString(newMatricule);
  56. else if(newMatricule <= 99)
  57.     matricule = "00" + Integer.toString(newMatricule);
  58. else if(newMatricule <= 999)
  59.     matricule = "0" + Integer.toString(newMatricule);
  60. else
  61.     matricule = Integer.toString(newMatricule);
  62. // Replace le nouveau matricule dans le fichier texte à la place de l'ancien.
  63.         try
  64.     {
  65.  BufferedWriter outfile =
  66.      new BufferedWriter(new FileWriter("SchoolOrganizer/Database/LastAssignedMatricule/" + _statute + ".txt" ));
  67.  outfile.write(matricule);
  68.  outfile.close();
  69.     }
  70. catch (IOException e)    {    }
  71.         // Place la lettre significative devant le numéro.
  72. String finalMatricule;
  73. if(_statute.equals("admin" ))
  74.  finalMatricule = "A" + matricule;
  75. else if(_statute.equals("superAdmin" ))
  76.  finalMatricule = "S" + matricule;
  77. else if(_statute.equals("teacher" ))
  78.  finalMatricule = "T" + matricule;
  79. else if(_statute.equals("student" ))
  80.  finalMatricule = "E" + matricule;
  81. else if(_statute.equals("planningSecretary" ))
  82.  finalMatricule = "P" + matricule;
  83. else if(_statute.equals("managementSecretary" ))
  84.  finalMatricule = "M" + matricule;
  85. return finalMatricule;
  86. }
  87. }


 
Mais les lignes en gras posent problème! j'ai les erreurs suivantes:
 

Citation :

.\Matricule.java:58: variable previousMatricule might not have been initialized
        int newMatricule = Integer.parseInt(previousMatricule) + 1;
                                            ^
.\Matricule.java:92: variable finalMatricule might not have been initialized
        return finalMatricule;
               ^
2 errors


 
J'me suis dit qu'il fallait au moins initialiser les deux variables et j'ai réécrit ces deux lignes comme ceci:
 

Code :
  1. String previousMatricule = "";


et

Code :
  1. String finalMatricule = "";


 
Ainsi, plus de problème à la compilation. Mais lors de l'éxécution, il m'affiche ceci:
 

Citation :

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at Matricule.nextMatricule(Matricule.java:58)
        at MatriculeTester.main(MatriculeTester.java:9)


 
 
Alors là je suis complètement perdu!  :??:  Vous pourriez me dire ce que j'ai raté s'il vous plaît?
 
 
 
Edit: Ajout de quelques explications dans mon code.


Message édité par MrRenaud le 17-03-2008 à 17:27:33
Reply

Marsh Posté le 17-03-2008 à 17:24:53    

Tu initialises tes valeurs à "", et la ligne :

Code :
  1. int newMatricule = Integer.parseInt(previousMatricule) + 1;
 

cherche à transformer "previousMatricule" en nombre.
Or, "" c'est pas un nombre.

 

I faudrait mettre "0", par exemple.


Message édité par gfive le 17-03-2008 à 17:25:13

---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 17-03-2008 à 17:28:33    

^^ ha :D purée, merci!

Reply

Marsh Posté le 17-03-2008 à 17:34:42    

Et j'ai une autre question:
 
Pour l'écriture et la lecture du fichier, j'ai commencé par le nom du package.  

Code :
  1. File file = new File("SchoolOrganizer/Database/LastAssignedMatricule/" + _statute + ".txt" );


 
Est-ce une pratique correcte?  
 
J'ai un doute parce qu'aucun fichier ne se crée et que lorsque j'exécute mon tester, il ne m'affiche rien du tout.
 

Code :
  1. public class MatriculeTester
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         Matricule generator = new Matricule("test" );
  6. System.out.println(generator.nextMatricule());
  7. System.out.println(generator.nextMatricule());
  8. System.out.println(generator.nextMatricule());
  9. System.out.println(generator.nextMatricule());
  10. System.out.println(generator.nextMatricule());
  11. System.out.println(generator.nextMatricule());
  12. Matricule generator2 = new Matricule("test2" );
  13. System.out.println(generator2.nextMatricule());
  14. System.out.println(generator2.nextMatricule());
  15. System.out.println(generator2.nextMatricule());
  16.         Matricule generator3 = new Matricule("test" );
  17. System.out.println(generator3.nextMatricule());
  18.     }
  19. }

 
 
Est-ce que je suis obligé de donner un chemin de fichier commençant par mon DD, du style "c:/projet/SchoolOrganizer/..." ?
A ce moment là c'est un peu embêtant si je veut utiliser mon programme sur un autre pc :s


Message édité par MrRenaud le 17-03-2008 à 17:35:32
Reply

Marsh Posté le 17-03-2008 à 17:58:04    

A vérifier, mais a priori quand tu crées un fichier en Java, il faut que le répertoire dans lequel il se trouve existe déjà. Pour cela, il te suffit de récupérer l'instance de File du répertoire parent (méthode getParentFile()), et de mémoire, il doit y avoir une méthode mkdirs() sur une instance de File pour créer un répertoire s'il n'existe pas et, éventuellement, si ses propres répertoires parents n'existent pas.
 
Un autre conseil : évite les blocs catch vides. Tu te serais rendu compte tout seul de ton erreur sur le Integer.parseInt() si tu avais correctement traité l'erreur IOException dans tes blocs "catch(IOException)".

Reply

Marsh Posté le 17-03-2008 à 18:03:44    

En fait je n'ai pas encore appris à utiliser les IOException, j'essaye de prendre un peu d'avance sur mon projet :) je verrai sûrement ça dans les prochains cours théoriques. Alors pour le moment je me débrouille avec l'API et ce que je trouve sur google ^^
 
Bon, j'vais améliorer mon code avec la création automatique des dossiers :)


Message édité par MrRenaud le 17-03-2008 à 18:04:49
Reply

Marsh Posté le 17-03-2008 à 18:03:44   

Reply

Marsh Posté le 17-03-2008 à 18:06:17    

Dans ce cas, écris au moins "catch (IOException e) { e.printStackTrace(); }" à la place de "catch (IOException e) { }". Même si tu ne comprends pas forcément ce que cela signifie, ça t'évitera de passer à côté des erreurs qui se produisent.

Reply

Marsh Posté le 17-03-2008 à 18:08:55    

Ok, merci, je retiens ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed