Votre question

[Résolu] Afficher un tableau Java

Tags :
  • string
  • Programmation
Dernière réponse : dans Programmation
29 Octobre 2010 19:18:52

Bonjour,

Petit problème de lecture en java...
Voilà mon code :
  1. public class tableau
  2. {
  3. //variables
  4. public String[] m_entries;
  5.  
  6. //constructor
  7. public tableau()
  8. {
  9. String m_entries[] = {"ordinateur","clavier","souris","écran"};
  10. }
  11. //méthodes
  12. public void getEntries()
  13. {
  14. System.out.println("Affiche la case 1 : " +m_entries[1]);
  15. // for (String entries : m_entries)
  16. // {
  17. // System.out.println(entries);
  18. // }
  19. }
  20.  
  21. public static void main (String[] args)
  22. {
  23. tableau tableau = new tableau();
  24. tableau.getEntries();
  25. }
  26. }


Voilà mon erreur :
Citation :

Exception in thread "main" java.lang.NullPointerException
at tableau.getEntries(tableau.java:14)
at tableau.main(tableau.java:24)


Je n'arrive pas afficher ne serait-ce qu'une case de mon tableau en passant par des méthodes.

Quelqu'un a une idée ?

D'avance merci !!

Autres pages sur : resolu afficher tableau java

a b L Programmation
29 Octobre 2010 20:29:40

m_entries est délcaré en local dans la méthode tableau(): tu ne modifies pas la variable membre m_entries, et ta variable locale est déréférencée à la sortie de la méthode.
m
0
l
29 Octobre 2010 23:05:06

Merci pour ta réponse mais je n'ai rien compris... ! Je débute et c'est chaud !
Je ne vois pas ce qui fait que m_entries est déclarée en local ou non ?!
m
0
l
Contenus similaires
29 Octobre 2010 23:21:30

Bonjour,

Ce qu'il te dit, c'est que tu as fais une déclaration de trop. Je m'explique :

  1. public class tableau
  2. {
  3. //variables
  4. public String[] m_entries;


Signifie que tu as créé une class qui se nomme tableau (au passage, mets toujours une majuscule sur la première lettre d'une classe, soit Tableau) et cette classe "tableau" contient une variable définie comme un tableau de String (chaîne de caractères).

Jusque là, tout vas bien, mais voila :

  1. //constructor
  2. public tableau()
  3. {
  4. String m_entries[] = {"ordinateur","clavier","souris","écran"};
  5. }


Dans ton constructeur (la méthode qui "initialise" ton objet lors de la création), tu fais une nouvelle déclaration :
"String m...."

Donc la variable de ta classe n'est pas définie, et elle vaut null.

Ce que tu aurais du faire :

  1. //constructor
  2. public tableau()
  3. {
  4. m_entries = {"ordinateur","clavier","souris","écran"};
  5. }


Comme tu peux le voir, il suffit d'enlever le "String ".
Et si tu veux une meilleur visibilité :

  1. //constructor
  2. public tableau()
  3. {
  4. this.m_entries = {"ordinateur","clavier","souris","écran"};
  5. }


Le "this." fait référence à soit même, donc à l'objet qui s'initialise. Et là tu peux pas te tromper, tu affectes une valeur à la variable de la classe et pas autre chose.

Voila, c'est tout, en espérant avoir été clair !
m
0
l
30 Octobre 2010 00:18:53

avec le "this." j'ai une erreur de compilation "illegal start of expression ...
bon je vais plancher un peu sur le this !

Merci pour votre aide en tout cas !
m
0
l
30 Octobre 2010 00:36:59

Tu l'as mis où le "this." ?
Tu as bien tout tapé comme je le montrais ?

(tu as peut être oublié d'enlever les "[]" ?)

Tiens, comme je suis de bonne humeur, un cadeau :

  1. public class Tableau {
  2. public String[] m_entries;
  3.  
  4. public Tableau(String... tableau) {
  5. this.m_entries = tableau;
  6. }
  7.  
  8. @Override
  9. public String toString() {
  10. if (this.m_entries == null || this.m_entries.length <= 0)
  11. return "empty array";
  12. String result = "";
  13. for (int i = 0; i < this.m_entries.length; i++)
  14. result += "[" + i + "] = " + this.m_entries[i] + "\n";
  15. return result;
  16. }
  17.  
  18. public static void main (String[] args) {
  19. System.out.println(new Tableau("ordinateur","clavier","souris","écran"));
  20. }
  21. }
m
0
l
30 Octobre 2010 00:58:53

ah oui... intéressant ! rien à voir avec ce que j'ai fait mais le résultat est nikel !
Je vais essayer d'intégrer ça dans mon programme maintenant...

Tu comprendras que j'aie plein de questions à poser :) 

On est donc obligé de déclarer les variables dans la méthode main ?

Qu'est-ce dont que ces "..." après String ? dans :

# public Tableau(String... tableau) {
# this.m_entries = tableau;
# }

Je ne peux pas conserver le "public void getEntries()" si je veux faire ce que je veux faire ?
Enfin, tu me comprends... enfin, j'espère !
m
0
l
30 Octobre 2010 01:23:11

tomsgeek a dit :
Tu comprendras que j'aie plein de questions à poser :) 


C'est normal, j'ai mis un code spécialement formateur qui t'obliges à poser des question si tu veux comprendre ! (sauf quand tu connais les principes de Java)

tomsgeek a dit :
On est donc obligé de déclarer les variables dans la méthode main ?


Non, absolument pas, je t'ai juste fais une classe qui se paramètre à la création.

En soit, c'est juste qu'ainsi on peut utiliser l'objet avec d'autres choses que "ordinateur", "clavier", etc...

Par exemple, ajoute dans le main

  1. System.out.println(new Tableau("toto","tata","tutu"));
  2. System.out.println(new Tableau("foo","bar"));
  3. System.out.println(new Tableau());


Ce qui donne :

  1. public static void main (String[] args) {
  2. System.out.println(new Tableau("ordinateur","clavier","souris","écran" ));
  3. System.out.println(new Tableau("toto","tata","tutu"));
  4. System.out.println(new Tableau("foo","bar"));
  5. System.out.println(new Tableau());
  6. }


Tu remarqueras que tout cela fonctionne très bien !

tomsgeek a dit :
Qu'est-ce dont que ces "..." après String ?


Il s'agit d'une petite astuce de Java (depuis la version 1.5 il me semble) et qui permet de définir une méthode avec un nombre de paramètres variables !

Si tu reprends mes exemples précédents :

  1. new Tableau("ordinateur","clavier","souris","écran")
  2. new Tableau("toto","tata","tutu")
  3. new Tableau("foo","bar")
  4. new Tableau()


Tu remarqueras (j'espère) que je crée un objet Tableau mais pas avec le même nombre de paramètre !
(4 paramètre pour tes chaines, 3 pour le "toto" etc., 2 pour le "foo" etc., et 0 pour le dernier)

Au final, le type de "tableau" dans le constructeur est équivalent à un tableau de String. Donc "tableau" est de type "String[]".

Mais en définissant avec cette forme :

  1. public Tableau(String[] tableau)


Tu es obligé de définir un tableau à l'initialisation, il n'y a qu'un seul paramètre et tu ne peux pas faire "new Tableau()".

Donc "String..." est une petite astuce, mais qui s'utilise avec précaution.

Ceci "void toto(int... i, float f)" est interdit ! Ne connaissant pas le nombre de paramètres à l'avance, il y aura une erreur puisque java sera incapable de savoir quand il prend le dernier !

L'utilisation du '...' doit être en dernière position : "void toto(float f, int... i)"

(rappel : 'int...' = 'int[]' comme vue ci-dessus)

tomsgeek a dit :
Je ne peux pas conserver le "public void getEntries()" si je veux faire ce que je veux faire ?


Si si, tu peux très bien le conserver !

J'ai utilisé une autre facilité de java. La méthode "toString()" existe pour tous les objets. Je l'ai "surchargé" (d'où le @Override au dessus) pour lui spécifier un fonctionnement spécifique.

Et l'avantage de cette méthode, c'est que java l'appellera dès qu'il devra utiliser l'objet dans une chaîne.
(le "println()" attendant un String, java convertira tout seul le "new Tableau(...)" en "(new Tableau(...)).toString()" )

Mais tu peux très bien utiliser ta méthode précédente, elle s'utilise comme tu le faisais tout en haut !
Ce n'est pas incompatible.

Je me suis juste dis que ça pourrait être intéressant de te montrer ça ...

m
0
l
30 Octobre 2010 20:19:30

Bonsoir,

Merci pour tes explications. En effet, c'est très intéressant. Je n'ai pas encore appliqué.... en fait ce petit morceau de programme fait partie d'un plus gros... Je travaille d'abord sur ce fameux tableau qui me bloque tout le reste. J'ai du mal à l'adapter et l'intégrer, je pense avoir tout les éléments, reste plus qu'à se prendre la tête !

Je ne comprends pas ces lignes :
  1. if (this.m_entries == null || this.m_entries.length <= 0)
  2. return "empty array";


C'est un test de condition pour ne pas traiter un tableau vide non ?
si j'utilise un void, je ne peux pas faire ce test ? Vu que d'après ce que j'ai compris : pas de return pour un void

Aussi le "+=" ?!

Si t'es toujours dans le coin et motivé pour une réponse ?!
m
0
l
31 Octobre 2010 00:51:48

Bonsoir,

tomsgeek a dit :

Je ne comprends pas ces lignes :
  1. if (this.m_entries == null || this.m_entries.length <= 0)
  2. return "empty array";


C'est un test de condition pour ne pas traiter un tableau vide non ?

Oui, du coup ça retourne une chaine de caractères contenant "empty array".

tomsgeek a dit :

si j'utilise un void, je ne peux pas faire ce test ? Vu que d'après ce que j'ai compris : pas de return pour un void

Tu peux faire tous les tests que tu veux, mais tu n'utiliseras pas "return...", tout dépend ce que tu veux faire avec ta fonction.
tomsgeek a dit :

Aussi le "+=" ?!

Le fait d'écrire "result +=..." est équivalent à "result = result +..."

++


m
0
l
31 Octobre 2010 00:59:56

Merci pour vos réponses, très formateur les forums :) 
j'ai d'autres soucis mais c'est du plus, je verrai après.
javascript:%20validform(this);
Bonne continuation !
m
0
l
31 Octobre 2010 02:13:29

On peut faire un "return" vide avec un void. Exemple :

  1. public void getEntries() {
  2. if (this.m_entries == null || this.m_entries.length <= 0) {
  3. System.out.println("Tableau vide");
  4. return;
  5. }
  6.  
  7. for (int i = 0; i < this.m_entries.length; i++)
  8. System.out.println("[" + i + "] = " + this.m_entries[i]);
  9. }

m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS