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

avec Java Discussion :

Non-static variable cannot be referenced from a static context


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Non-static variable cannot be referenced from a static context
    Bonjour,

    Je sais que cette question a déja été répondu, mais je ne comprend pas dans mon code comment ajuster le tout.

    Voici le code avec l'erreur qui affiche: System.out.println("\nImprimer ratio de Sarah: " + RatioMaison(ratioMaison));

    Voici l'explication: Non-static variable RatioMaison cannot be referenced from a static context

    Voici le code:


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    package tn2q3.pkg2;
     
    import java.util.Scanner;
     
    /**
     *
     * @author williammm
     */
    public class TN2Q32 {
     
        final static float IMPOT = 0.45f;
        float revenuMensuel, coutMaison, taxeMaisonM, ratioMaison;
        public static final String REVM = "Écrire le revenu mensuel: ";
        public static final String COUT = "Écrire le cout de la maison mensuel: ";
        public static final String TAXE = "Écrire la taxe maison mensuel: ";
     
        public TN2Q32(float revenuMensuel, float taxeMaisonM, float coutMaison) {
            this.revenuMensuel = revenuMensuel;
            this.coutMaison = coutMaison;
            this.taxeMaisonM = taxeMaisonM;
        }
     
         public float RatioMaison(float ratioMaison) {
           ratioMaison = (coutMaison + taxeMaisonM) / (revenuMensuel - (revenuMensuel * IMPOT));
           return ratioMaison;
        }
     
        public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
     
        System.out.print(REVM);
        float revenuMensuel = sc.nextFloat();
     
        System.out.print(COUT);
        float coutMaison = sc.nextFloat();
     
        System.out.print(TAXE);
        float taxeMaisonM = sc.nextFloat();
     
            System.out.println("\nImprimer ratio de Sarah: " + RatioMaison(ratioMaison));
            System.out.println("Imprimer ratio d'Alice: ");
            System.out.println("Imprimer ratio d'Arnaud: ");
        }
     
    }

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Pour faire simple, un élément "static" est lié au classLoader, donc, présent une seule fois dans la jvm.
    Sans ce mot clé, on est dans le registre d'un élément d'une instance de classe (instanciée via new entre autres), donc, on a n instances possibles d'une même classe.

    Pour ton problème, le plus simple est de mettre le mot-clé "static" devant ta méthode RationMaison et toutes les variables ou méthodes utilisées par cette méthode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Quand je mets static, maintenant mes variables ... = sc.nextFloat() ne fonctionne pu (unused)

  4. #4
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par iNeWx Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class TN2Q32 {
     
         [...]    
        public float RatioMaison(float ratioMaison) {
           ratioMaison = (coutMaison + taxeMaisonM) / (revenuMensuel - (revenuMensuel * IMPOT));
           return ratioMaison;
        }
         [...]    
    }
    ça, ça pique les yeux.

    Le nom de la méthode en majuscule, pas très conforme aux standards Java.
    Mais que fait ce paramètre (float ratioMaison) dans cette galère ? C'est la valeur de retour ! Et la classe ne l'initialise pas avant d'appeler cette méthode...

    Sinon, la solution la plus simple, désolé @OButterlin, serait d'instancier ta classe TN2Q32 dans sa méthode main().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      [...] // lectures par Scanner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TN2Q32 tn2q32 = new TN2Q32( revenuMensuel, taxeMaisonM, coutMaison );
    float ratioMaison = tn2q32.ratioMaison(); 
    [...]
    


  5. #5
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par iNeWx Voir le message
    Quand je mets static, maintenant mes variables ... = sc.nextFloat() ne fonctionne pu (unused)
    Tu définis 2 fois tes variables :
    dans la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float revenuMensuel, coutMaison, taxeMaisonM, ratioMaison;
    dans le main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float revenuMensuel = sc.nextFloat();
    Il s'agit pour le compilateur de variables différentes.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Cincinnatus Voir le message
    Sinon, la solution la plus simple, désolé @OButterlin, serait d'instancier ta classe TN2Q32 dans sa méthode main().
    Pas de souci, ça m'a parut le plus simple vu le fouillis dans le code (j'imagine que ce sont des tentatives de correction du problème qui l'ont engendré) mais c'est vrai qu'en instanciant TN2Q32, tu as accès aux 2 types de variables
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Excellent,

    J'ai changer un peu mon code pour éviter la répétition, mais j'ai toujours le même problème.

    Voici le nouveau code:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    package tn2q3.pkg2;
     
    import java.util.Scanner;
     
    /**
     *
     * @author williammm
     */
    public class TN2Q32 {
     
        final static float IMPOT = 0.45f;
        public float revenuMensuel, coutMaison, taxeMaisonM, ratioMaison;
        public static final String REVM = "Écrire le revenu mensuel: ";
        public static final String COUT = "Écrire le cout de la maison mensuel: ";
        public static final String TAXE = "Écrire la taxe maison mensuel: ";
     
         public static float Ratio(float ratioMaison) {
            ratioMaison = (coutMaison + taxeMaisonM) / (revenuMensuel - (revenuMensuel * IMPOT));
            return ratioMaison;
        }
     
        public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
     
        System.out.print(REVM);
        float revenuMensuel = sc.nextFloat();
     
        System.out.print(COUT);
        float coutMaison = sc.nextFloat();
     
        System.out.print(TAXE);
        float taxeMaisonM = sc.nextFloat();
     
            System.out.println("\nImprimer ratio de Sarah: " + ratioMaison);
            System.out.println("Imprimer ratio d'Alice: ");
            System.out.println("Imprimer ratio d'Arnaud: ");
        }
     
    }

  8. #8
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Est-ce que tu as compris que lorsque dans le main() tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float revenuMensuel = sc.nextFloat();
    tu redéfinis cette variable ? Et les autres de même ?

    Autrement dit, ces saisies vont dans des variables dont la portée se limite à la méthode main() et elle seule.

    Et en ligne 36, tu devrais avoir un plantage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("\nImprimer ratio de Sarah: " + ratioMaison);
    Tu vas lire une variable à laquelle aucune valeur n'a été affectée !

Discussions similaires

  1. Non-static variable cannot be referenced from a static context
    Par otylio dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 23/11/2018, 15h42
  2. Réponses: 39
    Dernier message: 04/08/2015, 22h09
  3. Réponses: 3
    Dernier message: 23/07/2015, 14h59
  4. Réponses: 4
    Dernier message: 12/02/2015, 10h27
  5. [FOP] [ERROR] non-static variable this cannot be referenced from a static context
    Par cash3000 dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/05/2006, 16h46

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