Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java]Classe Test

(je sais je suis lourd à poser autant de questions sur java u_u)

    9 mai 2006 à 8:56:22

    Bonjour

    je suis en train de faire une classe de test pour une application.
    Cette classe est :


    public class ClasseTest {
        Valeur[] tabVal = new Valeur[15];
       
        public ClasseTest(){
            tabVal[0].coordonnees = "01|01";
            tabVal[0].donnee = "donnée0";
            tabVal[0].style = 0;
            tabVal[0].taille[0] = 2;
            tabVal[0].taille[1] = 1;
            tabVal[0].x = 1;
            tabVal[0].y = 1;
            ///////////////////////////////
            tabVal[1].coordonnees = "03|02";
            tabVal[1].donnee = "donnée1";
            tabVal[1].style = 1;
            tabVal[1].taille[0] = 1;
            tabVal[1].taille[1] = 1;
            tabVal[1].x = 3;
            tabVal[1].y = 2;
            ///////////////////////////////
            tabVal[2].coordonnees = "04|03";
            tabVal[2].donnee = "donnée2";
            tabVal[2].style = 2;
            tabVal[2].taille[0] = 1;
            tabVal[2].taille[1] = 2;
            tabVal[2].x = 4;
            tabVal[2].y = 3;
            ///////////////////////////////
            tabVal[3].coordonnees = "03|01";
            tabVal[3].donnee = "donnée3";
            tabVal[3].style = 3;
            tabVal[3].taille[0] = 1;
            tabVal[3].taille[1] = 2;
            tabVal[3].x = 3;
            tabVal[3].y = 1;
            ///////////////////////////////
            tabVal[4].coordonnees = "04|01";
            tabVal[4].donnee = "donnée4";
            tabVal[4].style = 2;
            tabVal[4].taille[0] = 1;
            tabVal[4].taille[1] = 1;
            tabVal[4].x = 4;
            tabVal[4].y = 1;
            ///////////////////////////////
            tabVal[5].coordonnees = "01|02";
            tabVal[5].donnee = "donnée5";
            tabVal[5].style = 1;
            tabVal[5].taille[0] = 1;
            tabVal[5].taille[1] = 1;
            tabVal[5].x = 1;
            tabVal[5].y = 2;
            ///////////////////////////////
            tabVal[6].coordonnees = "01|03";
            tabVal[6].donnee = "donnée6";
            tabVal[6].style = 0;
            tabVal[6].taille[0] = 2;
            tabVal[6].taille[1] = 2;
            tabVal[6].x = 1;
            tabVal[6].y = 3;       
        }
    }

    (note la logueur est à 15 mais j'ia testé avec une longueur à 6... et comme je ne pensais ça n'a rien changé ^^')

    Où Valeur est une classe :
    public class Valeur {
        public String donnee;
        public String coordonnees;
        public int style=0;
        public int[] taille=new int[2];
        public int x;
        public int y;
    }

    le message d'erreur exact est :
    Exception in thread "main" java.lang.NullPointerException
        at ClasseTest.<init>(ClasseTest.java:6)
        at PlacementBordure.<init>(PlacementBordure.java:55)
        at PlacementBordure.main(PlacementBordure.java:234)

    les lignes en cause dans PlacementBordure (je ne la mets pas entièrement ca trop longue)
    ligne 55 :
        ClasseTest cT = new ClasseTest();

    ligne 234 :
            PlacementBordure boite = new PlacementBordure();

    Si quelqu'un a une idée..

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2006 à 9:29:22

      Si tu ne montres pas tous le code, ca risque d'être dur :/
      • Partager sur Facebook
      • Partager sur Twitter
        10 mai 2006 à 13:04:08

        Le problème est visible à l'écran.

        Quand tu fais
        Valeur[] tabVal = new Valeur[15];
        ca crée un tableau de 15 éléments contenant des références vers des objets de type Valeur. Ces références font quelques octets (3-4) et leur taille est constante, quel que soit le type d'objet référencé.

        L'erreur que tu as signifie que tu appelles un champ d'instance sur un objet valant null (je suppose que tu avais compris mais bon...). Cela est normal, car si tu as réservé de la place pour les références sur les objets, tu n'as pas réservé de mémoire pour tes objets eux-mêmes !

        Il faut le faire pour chaque référence à l'objet. Donc :

        Valeur[] tabVal = new Valeur[15];


        devient


        Valeur[] tabVal = new Valeur[15];
        for(int i=0 ; i<tabVal.length ; i++)
           tabVal[i] = CONSTRUCTEUR DE Valeur;


        Pour les puristes, il n'est pas possible ici d'utiliser une boucle for(Valeur v : tabVal), car le référencement est changé par le constructeur.

        Je pense que cette modification doit résoudre ton problème. Je vois par contre une très belle monstruosité en Java : tous tes champs d'instance sont publique, ce qui est à l'opposé du bien-penser Java. Normalement tous les champs d'instance (à part quelques exceptions) doivent être private ou protected, c'est un des principes de base d'une bonne modularité.

        Il faut donc dans ton cas mettre tous ces champs en private et construire un nouveau Valeur avec un constructeur. C'est ce constructeur qui se chargera de l'initialisation des champs, en fonction de ce qui a été passé en paramètre.

        Une autre chose : pour ton champ coordonnees, il vaut mieux créer une classe de ce type contenant 2 entiers, et manipuler ce champ comme un objet unique. Si les coordonnées étaient des double, la classe Point2D serait la plus adaptée. A toi de t'en inspirer pour faire la même chose en entier.
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2006 à 18:23:06

          Merci.

          Enr evanche pour les coordonnées, je laisse ça ainsi car ce n'est là que pour simmuler d'autres int que j'aurai dans la version finale donc je garde les deux int, c'est plus proche de ce que je vais avoir.

          Pour le public/private. Oui, mais par habitude, dans mes brouillons je mets tout en public ^^'
          • Partager sur Facebook
          • Partager sur Twitter

          [Java]Classe Test

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown