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 :

case expressions must be constant expressions


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut case expressions must be constant expressions
    Bonjour,

    J'ai un soucis avec un switch, j'ai l'erreur suivante sur chaque case: case expressions must be constant expressions

    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
    private final int stop=new Color(128,128,128+8).getRGB();
    private final int cp=new Color(128,128,128+9).getRGB();  
    private final int feuV=new Color(128,128,128+10).getRGB();
    private final int feuO=new Color(128,128,128+11).getRGB();
    private final int feuR=new Color(128,128,128+12).getRGB();
    ...
     
     
    fonction(){
     
    switch(getPatchColorAt(X,Y).getRGB()){
     
    case feuR:
    	return feuR+";"+X+";"+Y;
    case feuO:
    	return feuO+";"+X+";"+Y;
    case feuV:
    	return feuV+";"+X+";"+Y;
    case cp:
    	return cp+";"+X+";"+Y;
    case stop:
           return stop+";"+X+";"+Y;
    case carrefour:
    	return carrefour+";"+X+";"+Y;
    default:
    	return "OK";
    }
    return "erreur";
    }
    Pourtant mes variables sont declarees final et sont des int comme dit dans la faq. qu'est ce qui ne va pas ?

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je sais pas pourquoi, c'est ainsi, mais il faut les déclarer explicitement et non pas faire appel à une méthode pour les initialiser...

    Par exemple, si tu change comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private final int stop = 1;
    private final int cp 	= 2;  
    private final int feuV = 3;
    private final int feuO  = 4;
    private final int feuR  = 5;
    Ca va fonctionner.

    Par contre, je sais pas comment faire pour résoudre ton problème et que ca marche, mais il doit y avoir un truc certainement.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par semaj_james
    Pourtant mes variables sont declarees final et sont des int comme dit dans la faq. qu'est ce qui ne va pas ?
    Parce que le fait qu'elle soit final ne suffit pas pour que ce soit une constante.
    Il faut également que sa valeur puisse être déterminé à la compilation (et non pas à l'exécution).

    Ainsi, avec ce code :
    a est une constante qui vaut 1.


    Alors qu'avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	final int a = new Color(128,128,128+12).getRGB();
    a est une variable immuable, dont la valeur est défini à l'exécution, et qui ne peut pas être connu à la compilation.

    Pour être plus clair, le compilateur ne peut pas déterminer si le nombre renvoyé par getRGB() sera toujours le même, et ne le considère donc pas comme une constante.

    De ce fait, il ne peut pas utiliser cette valeur dans le switch...


    a++

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Ce qui doit suivre les case sont des String, or feuV, feuR sont des références vers des int donc ça ne marche pas.

    Par contre, peut-être devrais-tu creuser sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fonction(){
     
    switch(getPatchColorAt(X,Y).getRGB().toString()){
    					
    case feuR.toString():
    	return feuR+";"+X+";"+Y;
    case feuO.toString():
    ...
    default:
    	return "OK";
    }
    return "erreur";
    }

    Ah oui, effectivement, ce que dit adiGuba est totalement exact, j'avais pas pensé à ça...

  5. #5
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    jgavard, étonnant ce que tu dis !
    Les switch ne marchent QUE pour les int, et les types enumérés depuis j2se 1.5 !
    Je ferais plutôt confiance aux propos de adiguba...
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  6. #6
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par jgavard
    Ce qui doit suivre les case sont des String, or feuV, feuR sont des références vers des int donc ça ne marche pas.

    Par contre, peut-être devrais-tu creuser sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fonction(){
     
    switch(getPatchColorAt(X,Y).getRGB().toString()){
                        
    case feuR.toString():
        return feuR+";"+X+";"+Y;
    case feuO.toString():
    ...
    default:
        return "OK";
    }
    return "erreur";
    }
    Ah oui, effectivement, ce que dit adiGuba est totalement exact, j'avais pas pensé à ça...
    Non, non non je ne crois pas, depuis quand on peut faire un switch sur autre chose qu'un int ou un type Enum !!!!

    Primo:
    Cher
    jgavard tu ne dois pas connaitre java pour dire une telle ânerie... Merci quand tu veux aider d'essayer de ne pas dire n'importe quoi. Je sais pas où tu as tu pêcher ce code, qui ne doit en aucun cas compiler... Alors avant de balancer un exemple essaie de le compiler.

    Secundo:
    Des références vers des int, je ne connaissais pas... c'est nouveau ça vient de sortir !!! Je ne savais pas que le type int était un objet, merci jgavard pour tes lumières ça remet en cause presque 10 années de pratique de java.

    A+

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Pourtant, ce code compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String... args) {
        Color color = Color.BLACK;
        final int k = 2;
        switch(color.getBlue()) {
            case k:
        }
    }
    ...
    EDIT: Oui en fait g compris le problème, c'est que les valeurs des champs doivent être connus à la compilation... Avec un appel à une méthode, c'est pas connu à la compilation...

    Ainsi, ce code ne compile pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String... args) {
        Color color = Color.BLACK;
        final int k =  new Color(128,128,128+8).getRGB();
        switch(color.getBlue()) {
            case k: //erreur
        }
    }

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    J'avoue ma grand faute. Désolé pour mes ânneries.

  9. #9
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    Je vous remercie.

  10. #10
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Merci pour ces réponses

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

Discussions similaires

  1. error: expression must have a constant value
    Par alaninho dans le forum C++
    Réponses: 4
    Dernier message: 19/03/2012, 13h03
  2. [XSL] Expression must evaluate to a node-set
    Par tchoukapi dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 20/06/2006, 14h52
  3. [JSP] Expressions Languages et constantes
    Par Beuss dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/06/2006, 11h03
  4. [XSL] Expression must evaluate to a node-set.
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/04/2006, 14h04
  5. [Stored Procedure]Only constants, expressions, or variables
    Par nmerydem dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 20/10/2004, 18h29

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