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

Java Discussion :

Définition d'une constante de caractère vide


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut Définition d'une constante de caractère vide
    Salut,

    Suivant certains conseils j'utilise des constantes au lieu d'utiliser des valeurs explicites dans mon code. Par exemple :

    private static final String chaineVide = "";

    Toutefois, en ce qui concerne les caractères, il semblerais que l'absence d'une valeur n'est pas acceptée par le compilateur :

    private static final char charVide = '';
    private static final Character charVide = '';

    Est-ce possible de contourner ca ou dois-je utiliser un espace pour symboliser un caractère vide ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par Jimalexp Voir le message
    Toutefois, en ce qui concerne les caractères, il semblerais que l'absence d'une valeur n'est pas acceptée par le compilateur :
    private static final char charVide = '';
    private static final Character charVide = '';
    Est-ce possible de contourner ca ou dois-je utiliser un espace pour symboliser un caractère vide ?
    Qu'appelles-tu un caractère vide ?
    Que comptes-tu en faire ?

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    sinon tu peut toujours utiliser la valeur min d'un char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final char charVide = Character.MIN_VALUE;
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Qu'appelles-tu un caractère vide ?
    Que comptes-tu en faire ?
    L'utiliser à la place d'une comparaison en "dur", du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char entree;
     
    lecteur = new Scanner(System.in);
     
    lecteur.nextLine().charAt(0);
     
    if( entree != '' )
    faireQuelqueChose();
    Peut être un \n ferais l'affaire ? Je ne sais pas à quel caractère corresponds Character.MIN_VALUE.

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    cela correspond à la valeur la plus petite d'un char soit '\u0000'
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    En supposant que ce caractère ne corresponde pas à l'alphabet latin en unicode, ca pourrais faire l'affaire. Je vais aussi tester le contenu d'un char après lecture pour voir à quoi correspondrais un simple retour à la ligne.

    Merci pour les suggestions.

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    c'est la valeur null du char
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Hmm, donc je devrais peut être utiliser un Character au lieu de char et le mettre à null (vu que c'est un objet). Je vais essayer ca.

  9. #9
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    je ne vois pas ce que va t'apporter de plus le fait de passer par la classe Character a part faire plus de conversion.

    En plus un char possede comme valeur par defaut '\u0000' si tu ne l'initialise pas.
    Cela correspond parfaitement a ton besoin.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Salut,
    voici comment tester une chaine vide ou qu'avec des espaces plus proprement et reutilisable a d'autres endroits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public boolean isEmpty(char c)
      {
      return isEmpty(String.valueOf(c));
      }
     
    public boolean isEmpty(String str)
      {
      return (str == null || str.trim().length() == 0);
      }
    ---
    Farid

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par Jimalexp Voir le message
    L'utiliser à la place d'une comparaison en "dur", du genre :
    Et ça marche, ça ?

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Et ça marche, ça ?
    Si entree est du type char, oui bien sur, pourquoi ?

    ---
    Farid

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Bah parce que j'ai essayé et que curieusement (oupa?) Eclipse m'envoie chier, même après être passée en Java 5...
    Et puis je n'ai pas réussi à trouver d'indications sur le net concernant la signification de cette expression (j'ai pas cherché trop longtemps non plus, hein).

    Enfin, si c'est censé marcher, suffit de savoir ce que fait cette expression pour pouvoir remplacer dans la déclaration de charVide le '' par la valeur explicite représentée par '' dans la dite expression...
    D'après les réponses précédentes il s'agirait donc de '\u0000' ? L'expression (entree != '') est équivalente à (entree != '\u0000') ? Et c'est récent, pour que ma version d'Eclipse (3.1.2) ne connaisse pas cette syntaxe ?

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    J'ai corrige la declaration de la methode prenant le char comme parametre.
    J'avais mis Char au lieu de char...

    ---
    Farid.

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Et ça marche, ça ?
    Il y a des chances que non :p . Mais, si c'est les cas, c'est dommage de constater un manque de symmétrie entre caractère et chaîne. Enfin, on me diras qu'une châine est un ensemble de caractères et que la possibilité de tester si elle est "vide" se justifie alors que l'absence d'un char signifie qu'il n'y a pas de char tout simplement.

    P.S: J'ai peut être commis un abus aussi. En effet, j'utilise un autre langage qui fais la distinction entre les types en utilisant deux ' à la place de deux ".

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par Jimalexp Voir le message
    Il y a des chances que non :p
    Ouh là, j'ai cru que c'était moi qui étais à la ramasse sur une expression que je ne connaissais pas, mais en fait toi non plus tu ne sais pas vraiment de quoi tu parles
    Donc je reviens à ma question : que cherches-tu à faire ? Quand tu as écrit (entree != '') sans savoir si c'était possible, à quoi pensais-tu ?

    Citation Envoyé par Jimalexp Voir le message
    c'est dommage de constater un manque de symmétrie entre caractère et chaîne. Enfin, on me diras qu'une châine est un ensemble de caractères et que la possibilité de tester si elle est "vide" se justifie alors que l'absence d'un char signifie qu'il n'y a pas de char tout simplement.
    Je ne vois pas du tout pourquoi il faudrait une "symétrie" entre caractère et chaîne de caractères Un caractère, c'est un 'a', c'est un '9', c'est un '¤', c'est espace, c'est un retour à la ligne, c'est un autre caractère spécial que je ne saurais pas représenter mais qui correspond bien à une valeur, ça ne peut pas être "vide". Une chaîne de caractère c'est un ensemble de caractères, qui peut contenir 0 caractère, et alors on dit qu'elle est "vide".

    Quand tu dis "l'absence d'un char signifie qu'il n'y a pas de char tout simplement", faut-il comprendre que dans ton test tu cherchais à savoir si un caractère était présent à la 0-ième place dans la chaîne lecteur.nextLine() ? Dans ce cas ta méthode ne peut pas fonctionner.
    En effet, lorsque tu effectues lecteur.nextLine().charAt(0) :
    - soit il n'y a pas de ligne à lire, et donc nextLine va lever une NoSuchElementException, et tu n'arriveras jamais à ton test...
    - soit il y a une ligne à lire, mais cette ligne (chaîne de caractère) est vide, et donc charAt va lever une IndexOutOfBoundsException, et tu n'arriveras jamais à ton test...
    - soit il y a une ligne à lire, et cette ligne (chaîne de caractère) comprend au moins un caractère, et alors entree prendra la valeur de ce caractère (qui correspondra forcément à "quelque chose")

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Ouh là, j'ai cru que c'était moi qui étais à la ramasse sur une expression que je ne connaissais pas, mais en fait toi non plus tu ne sais pas vraiment de quoi tu parles
    Donc je reviens à ma question : que cherches-tu à faire ? Quand tu as écrit (entree != '') sans savoir si c'était possible, à quoi pensais-tu ?
    Tout simplement définir une constante dans une classe pour qu'elle soit rapidement modifiable dans la source (c'est une pratique courante dans le C, premier du nom) et ainsi contribuer à faciliter la maintenance. Le but est d'utiliser cette valeur pour faire un simple test sur l'entrée.

    Je ne vois pas du tout pourquoi il faudrait une "symétrie" entre caractère et chaîne de caractères
    Oui mais ... la symétrie est plus agréable .

    Quand tu dis "l'absence d'un char signifie qu'il n'y a pas de char tout simplement", faut-il comprendre que dans ton test tu cherchais à savoir si un caractère était présent à la 0-ième place dans la chaîne lecteur.nextLine() ? Dans ce cas ta méthode ne peut pas fonctionner.
    Le charAt est tout simplement destiné à recueillir un caractère à partir de Scanner pour animer un menu. Il n'existe pas de nextChar() et il faudrais que je mette au point une approche qui limite l'entrée à un seul caractère, sans plus (parceque une réponse "abcdefghijk" n'as rien à avoir avec une réponse "a"). Tes commentaires ci-dessous prêtent à réflêchir...

    En effet, lorsque tu effectues lecteur.nextLine().charAt(0) :
    - soit il n'y a pas de ligne à lire, et donc nextLine va lever une NoSuchElementException, et tu n'arriveras jamais à ton test...
    - soit il y a une ligne à lire, mais cette ligne (chaîne de caractère) est vide, et donc charAt va lever une IndexOutOfBoundsException, et tu n'arriveras jamais à ton test...
    - soit il y a une ligne à lire, et cette ligne (chaîne de caractère) comprend au moins un caractère, et alors entree prendra la valeur de ce caractère (qui correspondra forcément à "quelque chose")
    Merci de souligner tout ca. Je n'y avais absolument pas pensé. En effet, si nextLine ne retourne rien, il risque bien d'y avoir une exception lorsque la méthode charAt() est appellée.

    Je pense que le mieux serais d'utiliser un nextLine et de vérifier si l'entrée est limitée à un seul caractère. Pour tester l'absence de réponse, il suffiras de voir si la châine est vide.

  18. #18
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Bonjour

    Visiblement tu n'utilises pas bien le Scanner car cette classe implement Iterator, il existe donc la methode hasNext() afin de tester s'il y a d'autres tokens à lire.
    Normalement tu ne dois pas attendre de catcher NoSuchElementException pour déterminer qu'il n'y a plus d'élément a lire. C'est pas une bonne façon de coder, il faut savoir que la génération d'exceptions est très couteuse.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par Jimalexp Voir le message
    Tout simplement définir une constante dans une classe pour qu'elle soit rapidement modifiable dans la source
    Nan mais ça on l'a tous compris depuis longtemps, hein...
    La question c'est que cherches-tu à faire avec ce test ? au moment où tu voudrais utiliser ce "caractère vide", notion qui n'existe pas ?
    Tant que tu ne dis pas ce que tu voudrais faire on aura du mal à le deviner et à t'aider à trouver la bonne manière de procéder.

    Citation Envoyé par Jimalexp Voir le message
    Oui mais ... la symétrie est plus agréable
    Mais quelle symétrie ? Un caractère et une chaîne de caractères ce n'est pas du tout la même chose.
    Une pomme peut être une Golden, une Granny Smith, une Gala, une Reinette du Canada, etc... Un panier de pommes peut contenir 0, 1, 5 ou 1000 pommes (savoir si on arrivera à porter le panier est une autre histoire). Un panier vide est un panier qui contient 0 pomme. Une pomme est toujours une pomme, elle ne peut pas être "vide" à mon sens, je ne comprends donc pas ce que tu cherches à faire en "testant si la pomme est vide".

    Citation Envoyé par Jimalexp Voir le message
    Merci de souligner tout ca. Je n'y avais absolument pas pensé. En effet, si nextLine ne retourne rien, il risque bien d'y avoir une exception lorsque la méthode charAt() est appellée.
    En fait ce que j'ai dit n'est pas tout à fait exact. L'exception NoSuchElementException ne devrait pas avoir lieu, car le scanner va attendre jusqu'à qu'il arrive à lire une ligne, donc jusqu'à ce que l'utilisateur tape "entrée" dans la console (ceci ne marcherait pas avec un fichier bien sûr).
    Toutefois le second problème persiste : si l'utilisateur tape seulement "entrée" la ligne lue sera vide => impossible de lire le caractère. Mais dans ce cas, nextLine retourne bien quelque chose ! une chaîne de caractère qui ne contient aucun caractère, c'est à dire une chaîne vide...

  20. #20
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Nan mais ça on l'a tous compris depuis longtemps, hein...
    La question c'est que cherches-tu à faire avec ce test ? au moment où tu voudrais utiliser ce "caractère vide", notion qui n'existe pas ?
    Tant que tu ne dis pas ce que tu voudrais faire on aura du mal à le deviner et à t'aider à trouver la bonne manière de procéder.
    Comme mentionné ci-dessus, le but est de faire un simple test sur l'entrée clavier.

    Pour illustrer ca, voici un exemple de menu :

    Catalogue :
    1) Encoder un nouveau livre
    2) Rechercher un livre
    3) Afficher tous les livres

    Entrez votre choix: 1

    Rechercher un livre :
    a) Par titre
    b) Par isbn

    Entrez votre choix: a <= Donc ici je voudrais vérifier qu'un seul caractère est entré. En l'absence de caractère, je redemande à nouveau l'utilisateur pour qu'il fasse un choix.

    Toutefois le second problème persiste : si l'utilisateur tape seulement "entrée" la ligne lue sera vide => impossible de lire le caractère. Mais dans ce cas, nextLine retourne bien quelque chose ! une chaîne de caractère qui ne contient aucun caractère, c'est à dire une chaîne vide...
    Voila. C'est que je voulais savoir. Une chaine vide correspond à l'absence d'une entrée. C'est que je voudrais tester.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2010, 10h57
  2. Ma DLL retourne une chaine de caractère vide.
    Par alain8550 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/01/2010, 17h28
  3. Définition d'une constante
    Par Nabouille dans le forum Access
    Réponses: 4
    Dernier message: 14/01/2008, 10h57
  4. Tester une chaîne de caractères vide (débutant)
    Par Virtual78 dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2007, 17h11
  5. Réponses: 2
    Dernier message: 07/11/2007, 09h44

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