Probleme avec un tableau structuré

Probleme avec un tableau structuré - Java - Programmation

Marsh Posté le 29-07-2010 à 18:21:28    

Hello, je debute le dev sous Android et je debute egalement sous Java (je cumule) et du coup, je rencontre quelques difficultés avec le code suivant :
 

Code :
  1. // Ma structure
  2. public class typesite {
  3.  private String sitename;
  4.  private String sitecat;
  5.  private String siteurl;
  6.  private String sitelogin;
  7.  private String sitepwd;
  8.  private String siteemail;
  9.  public void feedit(
  10.    String name, String categ, String url,
  11.    String login, String password, String email) {
  12.   sitename  = name;
  13.   sitecat  = categ;
  14.   siteurl  = url;
  15.   sitelogin  = login;
  16.   sitepwd  = password;
  17.   siteemail = email;
  18.  }
  19. };
  20. public typesite siteinfo[];   // Tableau structuré


 
Ensuite dans ma classe principale je veux alimenter mon tableau en utilisant la méthode ma classe
 

Code :
  1. siteinfo[0].feedit( "YAHOO", "EMAIL", "http://www.yahoo.fr","test1", "passwd1", "email@email.fr" );


 
 
Aucune erreur de syntax detectée dans Eclipse, sauf que lors de l'execution, l'emulateur android detecte une erreur.
Et quand je met la ligne du dessus en commentaire, la ça passe, le programme se charge bien.
 
Vous avez une idée d'ou ça peut venir ?  
J'avoue que le java change un peu du C++ et je suis un peu perdu.
Merci d'avance ;)
 

Reply

Marsh Posté le 29-07-2010 à 18:21:28   

Reply

Marsh Posté le 30-07-2010 à 09:44:00    

Sans le message d'erreur ça va être dur de te dire d'où ça vient.
 
Mais il y a quand même de grandes chances que tu ais un NullPointerException qui serait dû au fait que tu n'aies pas initialisé siteinfo.
 
Donc si j'ai raison, soit siteinfo est null, soit il est vide, soit la valeur à l'indice 0 est null

Reply

Marsh Posté le 30-07-2010 à 12:56:54    

La ligne 22 : public typesite siteinfo[];  
elle est placée dans une autre classe ? Autrement dit siteinfo c'est un membre d'une autre classe ?
 
Utilise des ArrayList plutôt que des tableaux ça sera sans doute plus pratique.

Reply

Marsh Posté le 02-08-2010 à 10:04:40    

Bin en fait lors de la compilation il n'y a pas d'erreur (ou alors y'a une log avec un warning que j'ai pas vu). C'est lors de l'execution du programme que celui ci plante.
Sinon oui, la ligne 22 est dans une autre classe. ça viendrait de la le souci ?
 
Pour les Arraylist je connais pas mais est ce que je peux faire un ArrayList de ma classe (pour garder ma structure)
Un truc du genre
 

Code :
  1. public class typesite {
  2.  private String sitename;
  3.  private String sitecat;
  4.  private String siteurl;
  5.  private String sitelogin;
  6.  private String sitepwd;
  7.  private String siteemail;
  8. }
  9.   ArrayList arrList typesite = new ArrayList typesite
  10.   arrList.Sitename.add("Toto" );
  11.   ....


   
  Est ce que c'est correct ce genre de truc ou bien ce n'est pas comme ça qu'on emploi cette instruction ?

Reply

Marsh Posté le 02-08-2010 à 10:28:58    

Oula non ça va pas.  
Déjà mets une majuscule à typesite car c'est une classe et en Java on en met aux classes.
 

Code :
  1. Typesite siteinfo = new Typesite();
  2. siteinfo.feedit( "YAHOO", "EMAIL", "http://www.yahoo.fr","test1", "passwd1", "email@email.fr" );
  3.  
  4. ArrayList<Typesite> arrList = new ArrayList<Typesite>();
  5. arrList.add(siteinfo);

Reply

Marsh Posté le 02-08-2010 à 11:24:02    

Ok je commence a comprendre un peu mieux le principe des ArrayList. Merci ;)
 
Bon par contre mon programme plante toujours :'(
Je pense que ça viens de l'instruction pour récupérer les données du tableau
 
Je vous met mon code si ça peut vous aider :
 

Code :
  1. public class Main_class extends Activity {
  2.  
  3. public class Typesite {
  4.  private String sitename;
  5.  private String sitecat;
  6.  private String siteurl;
  7.  private String sitelogin;
  8.  private String sitepwd;
  9.  private String siteemail;
  10.  public void feedit(String name, String categ, String url,
  11.                   String login, String password, String email) {
  12.   sitename  = name;
  13.   sitecat  = categ;
  14.   siteurl  = url;
  15.   sitelogin = login;
  16.   sitepwd  = password;
  17.   siteemail = email;
  18.  }
  19. };
  20. public Typesite siteinfo = new Typesite();
  21. ArrayList<Typesite> arrList = new ArrayList<Typesite>();
  22.   public String sitename[];
  23.  
  24.     @Override
  25.     public void onCreate(Bundle savedInstanceState) {
  26.          
  27.      super.onCreate(savedInstanceState);
  28.       setContentView(R.layout.main);    // Ecran principal
  29.      
  30.       // Alimentation des données
  31.      siteinfo.feedit("YAHOO", "EMAIL", "http://www.yahoo.fr",
  32.                  "test1", "passwd1", "email1@email.fr" );
  33.      arrList.add(siteinfo);
  34.    
  35.      siteinfo.feedit("GMAIL", "EMAIL", "http://www.gmail.com",
  36.                  "test2", "passwd2", "email2@email.fr" );
  37.      arrList.add(siteinfo);
  38.    
  39.      siteinfo = arrList.get(0);
  40.      sitename[0] = siteinfo.sitename;
  41.      siteinfo = arrList.get(1);
  42.      sitename[1] = siteinfo.sitename;
  43.      
  44.       (...)   
  45.     } 
  46. }


 
Quand je met les valeurs en dur dans mon tableau sitename, ça fonctionne bien, j'ai bien un resultat affiché a l'ecran, mais par contre le fait de récuéprer les valeurs dans arrList me fait planter le programme.
 
Y'a pas une histoire comme quoi faut initialiser le ArrayList ? C'est peut etre pour ça que ça plante ?

Reply

Marsh Posté le 02-08-2010 à 11:30:49    

Faut l'initialiser dans le constructeur ou dans ta fonction.
Mais si c'était mal initialisé ça planterait au add.
 
En plus c'est faux ce que tu fais. En fait tu ajoutes le même siteinfo dans ta liste. Dans la liste ça prend la référence de l'objet si je dis pas de bêtise. Donc t'auras 2 fois les valeurs avec GMAIL.
 
Pourquoi au lieu de feedit tu ne fais pas ça dans le constructeur de Typesite ? Et tu fais new à chaque fois.

Reply

Marsh Posté le 02-08-2010 à 11:52:14    

Effectivement passer l'affectation au constructeur simplifiera grandement ;)
J'ai donc supprimé la fonction feedit et j'ai passé les instructions au constructeur de la classe Typesite
J'ai egalement créer une fonction getname() qui renvoi la valeur String de la zone sitename de cette meme classe. (vu que j'avais déclaré cette zone en private, je suis pas sur de pouvoir y acceder directement)
 
Du coup pour alimenter mon tableau je passe les instructions suivantes :
 

Code :
  1. siteinfo = new Typesite("YAHOO", "EMAIL", "http://www.yahoo.fr", "test1", "passwd1", "email1@email.fr" );
  2. arrList.add(siteinfo);
  3.    
  4. siteinfo = new Typesite("GMAIL", "EMAIL", "http://www.gmail.com", "test2", "passwd2", "email2@email.fr" );
  5. arrList.add(siteinfo);


     
Ensuite pour récupérer les valeurs je fais :
 

Code :
  1. siteinfo = arrList.get(0);


 
C'est censé me récupérer la première "ligne" de mon tableau dans ma structure siteinfo
Jusque la tout va bien.
 
Apres je tente de récupérer la valeur du champ sitename de cette première ligne :
 

Code :
  1. sitename[0] = siteinfo.getname();


 
Et la, bien qu'a la compilation aucune erreur ne soit detectée, le programme plante a l'execution.
Je pense que la le probleme se situe plus dans l'affectation de valeur.
 
En c je faisais un strcpy pour copier un champ String dans un autre et la j'ai l'impression qu'il faut faire la meme chose. Je vais chercher si une instruction similaire existe (en tout cas strcpy n'existe pas) mais a mon avis c'est ça.
 
Si jamais vous avez la reponse avant moi ou bien si je me gourre totalement dites le moi ;)

Reply

Marsh Posté le 02-08-2010 à 12:02:09    

C'est juste que tu n'initialises pas sitename
 

Code :
  1. sitename = new String[arrList.size()];


 

Reply

Marsh Posté le 02-08-2010 à 12:08:13    

Pourquoi ne pas utiliser également une ArrayList pour sitename ? Et est-ce que c'est pas redondant avec la liste  arrList ?

Reply

Marsh Posté le 02-08-2010 à 12:08:13   

Reply

Marsh Posté le 02-08-2010 à 14:04:38    

bon apres plusieurs essais infructeux avec mon tableau de String j'ai fait comme tu m'as dit j'ai transformé mon tableau de String sitename en ArrayList

Code :
  1. ArrayList<String> sitename;


Du coup je l'ai initialisé en debut de la classe principale :

Code :
  1. sitename = new ArrayList<String>();


Ensuite, apres avoir alimenté mon tableau siteinfo avec toutes mes informations, j'ai fait une boucle pour récupérer juste la zone siteinfo.sitename et l'insérer dans mon nouveau ArrayList    

Code :
  1. for(i=0; i<2; i++)
  2. {
  3.   siteinfo = arrList.get(i);    
  4.   sitename.add(i, siteinfo.sitename);
  5. }

 
Le test est concluant, ce coup ci je ne fais plus planter l'emulateur :)
     
     
Merci a tous pour votre aide

Reply

Marsh Posté le 02-08-2010 à 14:10:15    

Oublie pas de modifier le i<2 en i<arrList.size()
;)

Reply

Marsh Posté le 02-08-2010 à 14:25:40    

Oh oui pas bete ça, merci du conseil ;)

Reply

Sujets relatifs:

Leave a Replay

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