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 EE Discussion :

Expressions EL et division par zéro


Sujet :

Java EE

  1. #1
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut Expressions EL et division par zéro
    Bonjour,

    Un tuto me propose de créer une petite calculatrice avec Java EE : j'ai créé deux inputs et une liste déroulante nommée "operation" où l'on peut choisir entre les quatre opérations de base. Tout fonctionne à merveille... mais un peu trop bien : si je pose 45/0, l'application m'affiche "45/0 = 0" !! J'ai pourtant bien géré l'erreur dans mon code.
    op1 est le premier opérande, op2 le deuxième, signe est le signe de l'opération.
    Voici le code de getResultat() qui renvoie l'attribut int resultat de mon bean :

    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
    	public int getResultat() throws ArithmeticException{
    		switch(operation){
    		case "addition":
    			resultat = op1+op2;
    			break;
    		case "soustraction":
    			resultat = op1-op2;
    			break;
    		case "multiplication":
    			resultat = op1*op2;
    			break;
    		case "division":
    			try {
    				resultat = op1/op2;
    			} catch (ArithmeticException e) {
    				erreur = "Erreur : division par zéro !";
    			}
    			break;
    			default:
    				operation = "addition";
    				resultat = op1+op2;
    				break;
    		}
     
    		return resultat;
    	}
    (j'ai naturellement un getErreur()...)
    J'ai aussi essayé la version suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		case "division":
    			if(op2==0){
    				erreur = "Erreur : division par zéro !!";
    			}else{
    				resultat = op1/op2;
    			}
    			break;
    Et voici l'expression EL qui indique ce que je dois afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		le résultat est : <br />${calcul.op1}${calcul.signe}${calcul.op2} =
    			${!empty calcul.erreur ? calcul.erreur : calcul.resultat}
    Y a-t-il quelque chose que je n'ai pas compris dans la syntaxe de {empty...?}. Pour info, j'ai essayé l'expression dans l'autre sens : ${empty calcul.erreur ? calcul.resultat:calcul.erreur}, j'ai essayé en passant une simple variable erreur (sans en faire un attribut du bean), j'ai essayé avec une simple condition, sans utiliser une exception... Mais l'application m'affirme encore et toujours qu'un entier divisé par zéro est égal à zéro !

    Quelqu'un peut-il m'expliquer ce qui se passe ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    op1 et op2 sont des int, des Integer, des double, des Double?

  3. #3
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    op1 et op2 sont des int, des Integer, des double, des Double?
    Ce sont des int...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux montrer ton bean?

  5. #5
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    tu peux montrer ton bean?
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    package com.octpcalc.beans;
     
    import java.io.Serializable;
     
    public class Calcul implements Serializable{
    	/**
             * @author Markos
             */
    	private static final long serialVersionUID = 1L;
    	private int op1;
    	private int op2;
    	private int resultat;
    	private String operation;
    	private String signe;
    	private String erreur;
     
    	/**
             * @return the op1
             */
    	public int getOp1() {
    		return op1;
    	}
    	/**
             * @param op1 the op1 to set
             */
    	public void setOp1(int op1) {
    		this.op1 = op1;
    	}
    	/**
             * @return the op2
             */
    	public int getOp2() {
    		return op2;
    	}
    	/**
             * @param op2 the op2 to set
             */
    	public void setOp2(int op2) {
    		this.op2 = op2;
    	}
    	/**
             * @return the operation
             */
    	public String getOperation() {
    		return operation;
    	}
    	/**
             * @param operation the operation to set
             */
    	public void setOperation(String operation) {
    		this.operation = operation;
     
    		switch(operation){
    		case "addition":
    			this.signe = " + ";
    			break;
    		case "soustraction":
    			this.signe = " - ";
    			break;
    		case "multiplication":
    			this.signe = " x ";
    			break;
    		case "division":
    			this.signe = " / ";
    			break;
    			default:
    				this.signe = " + ";
    		}
    	}
    	/**
             * @return the resultat
             */
    	public int getResultat() throws ArithmeticException{
    		switch(operation){
    		case "addition":
    			resultat = op1+op2;
    			break;
    		case "soustraction":
    			resultat = op1-op2;
    			break;
    		case "multiplication":
    			resultat = op1*op2;
    			break;
    		case "division":
    			try {
    				resultat = op1/op2;
    			} catch (ArithmeticException e) {
    				erreur = "Erreur : division par zéro !";
    			}
    			break;
    			default:
    				operation = "addition";
    				resultat = op1+op2;
    				break;
    		}
     
    		return resultat;
    	}
    	/**
             * @return the signe
             */
    	public String getSigne() {
    		return signe;
    	}
    	/**
             * @return the erreur
             */
    	public String getErreur() {
    		return erreur;
    	}		
    }

  6. #6
    Membre confirmé
    Avatar de Jacques Beauregard
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 231
    Points : 595
    Points
    595
    Par défaut
    Salut,

    Dans une calculette tu as 10 int en input .
    Mais le résultat obtenu est-il toujours un int ?
    Il ne faut jamais prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont...

    Le guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu a une méthode curieuse de faire le calcul dans le getter. En général, on fait le calcul dans une action, et le getter retourne le dernier résultat.

    Du coup ton test
    ${!empty calcul.erreur ? calcul.erreur : calcul.resultat}
    est faux puisque tu teste la valeur de "erreur" avant d'appeler resultat, resultat qui est celui qui calculera la valeur de erreur. Soit tu déplace ton calcul dans une action, soit getErreur doit aussi déclencher le calcul pour savoir si il y a une erreur.

  8. #8
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu a une méthode curieuse de faire le calcul dans le getter. En général, on fait le calcul dans une action, et le getter retourne le dernier résultat.

    Du coup ton test

    est faux puisque tu teste la valeur de "erreur" avant d'appeler resultat, resultat qui est celui qui calculera la valeur de erreur. Soit tu déplace ton calcul dans une action, soit getErreur doit aussi déclencher le calcul pour savoir si il y a une erreur.
    Je ne pense pas. L'erreur n'est pas le résultat de l'opération. Dans mon bean, si l'opération est une division (case "division"...), on teste si le deuxième opérande (l'attribut op2) est égal à zéro. Si c'est le cas, on affecte la valeur "Erreur : division par zéro !!" à l'attribut "erreur", qui est une chaîne de caractères. Pas besoin de déclencher le calcul, donc. Ensuite, si l'attribut "erreur" n'est pas empty, on affiche le message. Si en revanche la chaîne est vide, alors on affiche le résultat du calcul.

    Tout se passe comme si le test op2==0 n'était jamais "true"... Je ne comprends pas bien pourquoi. C'est là que je butte...

  9. #9
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Jacques Beauregard Voir le message
    Salut,

    Dans une calculette tu as 10 int en input .
    Mais le résultat obtenu est-il toujours un int ?
    Ici, il ne s'agit pas d'une "calculette". Ce sont deux zones de texte et une liste déroulante pour l'opération. De plus, le fait que mon résultat soit un int ou pas ne semble pas gêner l'application, puisqu'elle effectue les opérations à chaque fois. Le seul et unique défaut, c'est que pour une division par zéro elle renvoie comme résultat : zéro.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Markos22 Voir le message
    Je ne pense pas. L'erreur n'est pas le résultat de l'opération. Dans mon bean, si l'opération est une division (case "division"...), on teste si le deuxième opérande (l'attribut op2) est égal à zéro.
    Je ne vois ce test nulle part en dehors de getResultat dans ton code...

  11. #11
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Je ne vois ce test nulle part en dehors de getResultat dans ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case "division":
    			if(op2==0){
    				erreur = "Erreur : division par zéro !!";
    			}else{
    				resultat = op1/op2;
    			}
    			break;
    puis, dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${!empty calcul.erreur ? calcul.erreur : calcul.resultat}
    : donc si l'attribut "erreur" du beans calcul n'est pas empty, j'affiche cet attribut. Sinon, j'affiche l'attribut résultat.
    Quel est le test que tu ne vois pas ?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le bout de code que tu viens de donner n'est pas dans le bean que tu as posté plus haut. Tu peux montrer le bean qui inclue ce code? Pour le moment tout ce que je vois c'est que le seul endroit où tu définis erreur à une valeur non nulle c'est dans getResultat. Hors tu teste dans ton jsp la valeur de erreur AVANT d'appeler getResultat.

  13. #13
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Ça y est ! Je viens de comprendre ! Pour que l'attribut "erreur" soit renseigné, il faut que j'appelle la méthode getResultat. Or, je ne l'appelle que lorsque j'affiche mon résultat dans ma JSP (oui, je sais vous me l'avez dit mais je suis lent) !

    Finalement, j'ai géré l'erreur avec une exception : dans ma servlet :

    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
    		Calcul calcul = new Calcul();
     
    		calcul.setOp1(op1);
    		calcul.setOp2(op2);
     
    		String operation = request.getParameter("operation");
    		calcul.setOperation(operation);
    		if(operation.equals("division") && op2==0){
    			try {
    				throw new DPZException();
    			} catch (DPZException e) {
    				// TODO Auto-generated catch block
    				erreur = e.erreur;
    				request.setAttribute("erreur", erreur);
    			}
    		}
    Mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class DPZException extends Exception {
    	public String erreur;
     
    	public DPZException(){
    		erreur = "Erreur : division par zéro !!";
    	}
    }
    et ma JSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			le résultat est : <br />${calcul.op1}${calcul.signe}${calcul.op2} =
    			${empty erreur?calcul.resultat:erreur}
    Il n'est même plus besoin de la traiter dans le bean ! Tout fonctionne parfaitement, à présent !

    Merci à tous.

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

Discussions similaires

  1. Division par zéro
    Par soltani1 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 18/05/2006, 09h42
  2. [Tableaux] Pb de division par zéro...
    Par blueice dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 15h52
  3. [CR][VS.NET]Division par zéro
    Par San Soussy dans le forum SDK
    Réponses: 2
    Dernier message: 31/08/2005, 14h40
  4. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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