IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

tableau non référencé


Sujet :

Langage Java

  1. #1
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut tableau non référencé
    bonjour à tous,

    j'ai créé une classe "Identité2" qui contient deux membres, le nom et le prénom de la personne, initialisée pour le test à : patrick martin.
    Le code simple est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package main;
     
    import java.io.Serializable;
     
    // --------  classe Identité2  -------------------
    public class Identité2 implements Serializable{
    	private static final long serialVersionUID = 1L;
     
     
    		// membres
    			public	String nom = " patrick";
    			public	String prenom = "martin" ;
     
    		// constructeur
    				public Identité2() {
    				}
     
    }
    // =======  fin de classe Identité2=============
    Quand je créé une identité par défaut, comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Identité2 qui = new Identité2();
    		System.out.println("mon identité de type Identité2 vaut : " + qui.nom + " et : " + qui.prenom);
    je récupère bien mon identité par défaut :
    Nom : patrick martin.png
Affichages : 69
Taille : 4,2 Ko

    Je sais, je n'ai pas grand mérite.....

    Je créé ensuite un tableau, pour stocker mes identités. Je l'implémente au début de ma classe en static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		static Identité2[] nomsDesPrésents = new Identité2 [nbParticipants];
    Ensuite, plus loin, je désire faire une boucle pour intialiser ce tableau avec les strings "absent" pour le nom et le prénom. (Je sais, j'aurai initialiser dans la classe à la création, le problème serait peut-être évité, mais j'aimerais comprendre ma mauvaise manip...)
    Cela ne fonctionne plus !! Même si je prends des caractéristiques du tableau créé, il semble bien exister, mais le compilateur me dit que la référence pointe vers rien!!!
    (le tableau listeIn, créé en static également ne pose aucun problème. J'ai affiché ses caractéristiques pour essayer de voir des différences avec celles affichées pour nomsDesPrésents qui semble non accessibles par index...)

    Même si j'essaie un accès avec un index du tableau en dur, ca ne veut pas...
    Le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    		// on initialise les tableaux de stockage
     
    		for (int i = 0 ; i<nomsDesPrésents.length; i++) {
     
    			System.out.println("voila listeIn au point maudit : " + listeIn);
    			System.out.println("voila nomDesPrésents au point maudit : " + nomsDesPrésents + ", de longueur : " + nomsDesPrésents.length);
    			System.out.println("i = " + i + "la valeur initiale est : " + nomsDesPrésents[i].nom);
     
     
    			nomsDesPrésents[i].nom = "absent";
    			nomsDesPrésents[i].prenom = "absent";
    			listeIn[i] = null;
    			listeOut[i] = null;
    		}
    La console indique :
    Nom : réponse patrick martin.png
Affichages : 67
Taille : 9,1 Ko

    Voila mon soucis. Je n'ai pas ce genre de problème d'habitude. Peut-être la fatigue car ça ne parait pas très compliqué.
    Si mon erreur saute aux yeux de quelqu'un, ce sera un grand MERCI!....
    Bonne soirée.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Hello,

    ben ça ne se devine pas. D'habitude les débutants suivent un cours ou un tutoriel, mais si tu préfères essayer des trucs et demander, soit...

    Pour rappel dans le cas qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Identité2 qui = new Identité2();
    tu as appelé le constructeur avec new Identité2(), ce qui a créé un objet de cette classe.

    Et dans le cas qui marche pas, tu ne l'as pas fait, donc aucun objet de cette classe n'a été créé. Comme ton tableau ne peut pas contenir d'objet qui n'existe pas, il ne contient que du null.

    Si au début de ta boucle tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomsDesPrésents[i] = new Identité2();
    l'erreur disparaîtra. Après, forcément tous tes objets auront les mêmes noms et prénoms. Mais ça c'est pas magique, des données, il faut que ça vienne de quelque part, 'faut avoir un plan pour ça.

  3. #3
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut classe native ou classe perso
    Bonjour Thelvin,

    un grand MERCI à toi donc, pour m'avoir débloqué dans mon programme.

    En fait, j'ai comparé avec ce qui fonctionnait bien, construit de la même manière, et dans mon cas, ce sont les deux autres tableaux statiques avec des "ObjectInputStream" et des "ObjectOutputStream", qui eux, ne semblent pas imposer cette intantiation individuelle de chaque objet avant le stockage en tableau.
    J'ai essayé également avec des "int" et des "string", et dans ces cas également, la simple création du tableau permet son utilisation sans créer pour chaque case un "new Object()".

    En fait, même après avoir instancié un tableau en identifiant forcément sa classe, le fait de devoir instancier chaque objet avant de pouvoir l'utiliser est-il lié au fait que c'est une classe personnelle créé par le programmeur, et le fait de l'utilisation "directe" est-elle permise si on utilise une classe native de java??

    (Pour info, en fait, je me documente sur des tutos, mais parfois, on a beau insister, comme ici, on passe à travers sans avoir le bon déclic, et un coup de pouce permet de nous dispenser de nombreuses heures de galère...)

    Merci pour tout, car je vois que tu est très présent sur les aides en java, pour débloquer beaucoup de personnes et j'imagine que cela prend pas mal de temps...

    A bientôt peut-être...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Hello, non ça fonctionne tout pareil.

    C'est faux que tu peux utiliser les autres avant le stockage dans le tableau.

    Ça, c'est le stockage dans le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[index] = valeur;
    Donc quand tu fais nomsDesPrésents[i] = new Identité2(); c'est ça le stockage dans le tableau.

    Et bien sûr il est nécessaire de stocker quelque chose dans le tableau avant de t'en servir.

    Quand tu fais nomsDesPrésents[i].nom tu cherches à utiliser les valeurs String nom des objets dans le tableau. Bien entendu ce n'est pas possible tant que tu n'as pas mis un objet à cet endroit.

    C'est pareil avec des ObjectInputStream et des String, c'est juste que tu fais des raccourcis dans ta tête alors qu'il n'y a pas à en faire. Tant que tu n'as pas fait tableau[index] = valeur; tu n'as pas stocké. Point.

    Ça peut paraître différent avec les ints et les autres primitifs, parce que quand on crée leurs tableaux, chaque emplacement contient 0 ou '\0' ou false. Ce n'est pas null parce que les primitifs ne peuvent pas être null.
    Mais ça reste des valeurs qui ne sont pas celles qu'on veut, puisque pour l'instant on y a pas mis les valeurs qu'on veut. C'est "utilisable" parce que les primitifs ne contiennent pas de variable ni de méthode, donc on ne peut pas essayer d'écrire 2.nom ou 2.afficher(). 2 c'est juste le nombre 2. "utiliser" un primitif c'est juste l'utiliser lui-même, l'afficher ou l'additionner à un autre. Il n'y a pas de notion d'accéder à son "contenu" qui n'existe pas.

    Citation Envoyé par patdu26 Voir le message
    (Pour info, en fait, je me documente sur des tutos, mais parfois, on a beau insister, comme ici, on passe à travers sans avoir le bon déclic, et un coup de pouce permet de nous dispenser de nombreuses heures de galère...)
    Je ne parlais pas tant de se documenter, que d'apprendre le langage lui-même. Ça me semble abusivement ambitieux de se lancer dans un projet Java quand on ne comprend pas la notion qu'un tableau est créé avec des valeurs par défaut. N'importe quel apprentissage de Java couvre cela en temps et en heure.

  5. #5
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut Merci.. à nouveau!
    Cette fois je pense que j'ai compris les flottements concernant mon approche.
    En fait, je fais inconsciemment des raccourcis, qui fonctionnent uniquement avec des variables natives et utilisées de manières simples.
    Quand je réalise la même démarche avec des éléments plus complexes, comme des objets mêmes simples, le flou de la démarche entraine une incapacité à traiter ma demande, car les "raccourcis non clairement exprimés" ne peuvent déboucher sur rien pour le compilateur.

    Donc :
    1/ je créé mon tableau pour le référencer et réserver son espace en mémoire.
    2/ Dans chaque emplacement de mon tableau, je créé une instance de mon objet, pour créer la structure interne de mon emplacement, y stocker une valeur initiale qui de fait, ne sera plus "null" et donc accessible pour y stocker des valeurs de travail ensuite.

    Ok, en effet, à présent tout fonctionne nickel!

    Je vais m'employer à plus de rigueur dans la création et le stockage de mes objets.

    Encore MERCI!!!

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo