Partage
  • Partager sur Facebook
  • Partager sur Twitter

Error: non-static method

problème d'accès aux setters et getters dans une autre classe

    30 novembre 2020 à 11:02:15

    Bonjour,

    Je suis en train de faire un petit programme pour gérer une bibliothèque.

    J'ai fais une simple classe user qui à quelques variables et les setters et getters correspondant, et j'ai fais une autre classe testUser qui test l'accès aux getters et setters de la classe user.

    Pour le moment je veux juste tester l'accès à 2 String, donc j'ai fais une méthode qui permet de rentrer les données (via les setters) et una autre méthodes qui permet d'afficher (getters) ce que je viens de rentrer comme infos.

    Mais j'ai une erreur et je n'arrive pas à la résoudre.(voir photo ci-joint)

    J'ai essayé de mettre

    static


    partout, ou à l'inverse de l'enlever partout, mais soit ça ne compile pas, soit ça compile mais ça ne marche pas.

    classe user.java :

    import java.io.*;
    import java.util.*;
    import java.time.*;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    
    public class user {
        // variables
        boolean admin=false;
        int numSecu;        // numéro unique pour chaque usagé
        String nom;
        String prenom;
        //LocalDate anniv;    // date d'anniversaire
        String anniv;    // date d'anniversaire
        LocalDate dateCreationCompte = LocalDate.now(); // date de creation du compte
        String pseudo;      // pseudo choisit pour se connecter au logiciel
        String mdp;         // mot de passe pour se connecter au logiciel
    
        // getters & setters
        public boolean getAdmin() {
            return this.admin;
        }
    
        public void setAdmin(boolean admin) {
            this.admin=admin;
        }
    
        public int getNumSecu() {
            return this.numSecu;
        }
    
        public void setNumSecu(int numSecu) {
            this.numSecu = numSecu;
        }
    
        public String getNom() {
            return this.nom;
        }
    
        public void setNom(String nom) {
            this.nom = nom;
        }
    
        public String getPrenom() {
            return this.prenom;
        }
    
        public void setPrenom(String prenom) {
            this.prenom = prenom;
        }
    
        public String getAnniv() {
            return this.anniv;
        }
    
        public void setAnniv(String anniv) {
            this.anniv = anniv;
        }
    
        public LocalDate getdateCreationCompte() {
            return this.dateCreationCompte;
        }
    
        public String getPseudo() {
            return this.pseudo;
        }
    
        public void setPseudo(String pseudo) {
            this.pseudo = pseudo;
        }
    
        public String getMdp() {
            return this.mdp;
        }
        
        public void setMdp(String mdp) {
            this.mdp = mdp;
        }
    
       public static void main(String[] args) {}    
    }
    

    classe testUser.java :

    import java.util.*;
    import java.util.Date;
    import java.util.Scanner;
    import java.text.ParseException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.io.*;
    import java.io.IOException;
    
    // classe test de récupération et affichage des informations d'un utilisateur
    public class testUser {
        // creation d'un objet testUser de type user
        user testUser;
    
        public void rentreData() {
    
            // lecture des entrées clavier
            Scanner sc = new Scanner(System.in);
            String str;
            // lecture de String
            // String str = sc.nextLine();
    
            System.out.println("creation d'un user");
            System.out.println("==================");
            System.out.println("quel nom veux-tu lui donner ? ");
            str = sc.nextLine();
            testUser.setNom(str);
    
            System.out.println("Quel est sa date d'anniv ? format = 01/02/1970 ");
            try {
                if(str.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")){
                    SimpleDateFormat f = new SimpleDateFormat("MM-dd-yyyy");
                    // Date date = f.parse(sDate);
                    Date date = f.parse(str);
                }
            } catch (ParseException e) {}
            str = sc.nextLine();
            testUser.setAnniv(str);
        }
    
        public void afficheData() {
            System.out.println("Affichage des données de testUser");
            System.out.println("=================================");
            System.out.println("Tu lui as donné "+testUser.getNom()+" comme nouveau nom");
            System.out.println("Sa date d'anniversaire est "+testUser.getAnniv());
    
        }
    
        public static void main(String[] args) {
            rentreData();
            afficheData();
        }  
    }
    

    la compilation pour user.java marche très bien

    et voici l'erreur  de testUser.java qui ne compile pas :

    $ javac testUser.java

    testUser.java:50: error: non-static method rentreData() cannot be referenced from a static context
            rentreData();
            ^
    testUser.java:51: error: non-static method afficheData() cannot be referenced from a static context
            afficheData();
            ^
    2 errors
    




    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2020 à 11:27:33

      _Bigboss_001 a écrit:

      J'ai essayé de mettre

      static


      partout, ou à l'inverse de l'enlever partout, mais soit ça ne compile pas, soit ça compile mais ça ne marche pas.

      et voici l'erreur  de testUser.java qui ne compile pas :

      $ javac testUser.java

      testUser.java:50: error: non-static method rentreData() cannot be referenced from a static context
              rentreData();
              ^
      testUser.java:51: error: non-static method afficheData() cannot be referenced from a static context
              afficheData();
              ^
      2 errors
      




      Tu as mal essayé. 

      Les messages sont explicites, et ne suggèrent pas que tu mettes static "partout", mais juste au  bon endroit, dans l'entete des deux méthodes.

       public static void afficheData() {


      Que ça ne marche pas, c'est une autre histoire. Ca s'explique aussi, il ne peut pas marcher, il n'a pas de pattes.

      Commence par corriger tes erreurs de syntaxe. Après, si ça ne marche pas comme tu veux, tu nous diras

      • ce que tu voulais que ça fasse
      • ce que ça fait en réalité.
      en décrivant complètement le dialogue qui mène à une erreur manifeste.

      -
      Edité par michelbillaud 30 novembre 2020 à 11:34:55

      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2020 à 11:28:12

        Bonjour. Toutes les méthodes dans ta classe testUser (devrait être TestUser d'ailleurs) doivent être "static", les attributs aussi. Donc

        static user testUser;
        
        public static void afficheData()
        
        public static void rentreData()



        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2020 à 11:47:30

          Bonjour,

          rentreData et afficheData n'ont pas besoin d'être appelées à partir d'un objet. Ce sont donc des méthodes statiques. Pour avoir accès à testUser, il doit être statique lui aussi. Par contre, la ligne 13 ne crée pas d'objet. Elle crée une variable de type user qui vaut null par défaut. On orée des objets avec le mot-clé new.

          MaClasse monObjet = new MaClasse(/* paramètres */);

          Attention aux conventions de codage. Les noms de classes doivent commencer par une majuscule.

          Attention aussi, le format de tes dates ne correspond pas à la saisie demandée. Aussi, utilise plutôt LocalDate que Date qui est une classe un peu datée :)

          • Partager sur Facebook
          • Partager sur Twitter
            30 novembre 2020 à 12:12:26

            Après, on peut discuter de l'intérêt (aucun !) d'avoir des getters et setters partout.

            La classe User définit des _agrégats_ tous bêtes. Pas des objets au sens de "conception orientée objets", dans laquelle un objet n'est pas là pour contenir des champs, mais pour rendre des services. Et ici, User n'en rend aucun.

            Le genre de truc inutile : changer la date de naissance. Ca vous est arrivé souvent, à vous ?

            Heureusement, il commence à y avoir des "records" en Java.

            https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

            -
            Edité par michelbillaud 30 novembre 2020 à 12:13:51

            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2020 à 12:40:57

              Un grand Merci à tous pour vos réponse très rapide !

              (J'ai corrigé les majuscules des classes :D )

              @michelbillaud :


              Alors tout simplement je veux juste avoir accès partout dans n'importe quelle classe à la classe User pour modifier ou consulter ces information

              @kulturman :

              merci ça marche, mais pas tout à fait car comme l'a très bien explqué @brubru777(merci à toi j'ai beaucoup mieux compris) j'ai créé "null" donc j'avais une erreur ..PointerException... quelque chose comme ça

              Donc @brubru777  merci j'ai corrigé et j'ai donc délcaré comme cela :

                  static User totoNewUser = new User();
              



              et j'ai donc rajouté static aux méthodes rentreData() et afficheData()

              Je vais changer en LocalDate comme tu m'as dit aussi

              ------------------------------------------------------------------------

              michelbillaud a écrit:

              Après, on peut discuter de l'intérêt (aucun !) d'avoir des getters et setters partout.

              La classe User définit des _agrégats_ tous bêtes. Pas des objets au sens de "conception orientée objets", dans laquelle un objet n'est pas là pour contenir des champs, mais pour rendre des services. Et ici, User n'en rend aucun.

              Le genre de truc inutile : changer la date de naissance. Ca vous est arrivé souvent, à vous ?

              Heureusement, il commence à y avoir des "records" en Java.

              https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

              -
              Edité par michelbillaud il y a 27 minutes

              Bah en gros j'aurais besoin d'accéder quasiment tout le temps à ces variables, dans chaque (futures) classes que je vais créer



              -
              Edité par _Bigboss_001 30 novembre 2020 à 12:55:35

              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2020 à 12:53:12

                _Bigboss_001 a écrit:

                Bah en gros j'aurais besoin d'accéder quasiment tout le temps à ces variables, dans chaque (futures) classes que je vais créer



                Tout mettre en "public" ça revient au même, mais en plus simple.
                • Partager sur Facebook
                • Partager sur Twitter
                  30 novembre 2020 à 12:56:05

                  michelbillaud a écrit:

                  Après, on peut discuter de l'intérêt (aucun !) d'avoir des getters et setters partout.

                  La classe User définit des _agrégats_ tous bêtes. Pas des objets au sens de "conception orientée objets", dans laquelle un objet n'est pas là pour contenir des champs, mais pour rendre des services. Et ici, User n'en rend aucun.

                  Le genre de truc inutile : changer la date de naissance. Ca vous est arrivé souvent, à vous ?

                  Heureusement, il commence à y avoir des "records" en Java.

                  https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

                  -
                  Edité par michelbillaud il y a 27 minutes

                  Bah en gros j'aurais besoin d'accéder quasiement tout le temps à ces variables, dans chaque (futures) classes que je vais créer

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 novembre 2020 à 14:31:31

                    On n'est pas trop de deux à le dire  : laisse tes champs publics et laisse tomber les accesseurs / mutateurs.

                    Et autant que possible

                    • Initialise les a la construction
                    • Declare les "final" 

                    -
                    Edité par michelbillaud 30 novembre 2020 à 14:33:16

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Error: non-static method

                    × 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