Se connecter avec
S'enregistrer | Connectez-vous

[Résolu] Afficher un tableau Java

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte
Expert Programmation

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 !
Expert Programmation

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. }

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 !
Expert Programmation

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 ...

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 ?!

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 +..."

++


Expert Programmation

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. }

Lassé par la pub ? Créez un compte
Tom's guide dans le monde