Erreur sur les Exceptions personnalisées en JAVA [Résolu]

Signaler
Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
-
Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
-
Bonjour
Je ne comprend pa l'erreur que j'obtient avec l'exception SalarieException :
package fr.xxxx.yyyy;

import java.util.Enumeration;
import java.util.Hashtable;

import fr.xxxx.exceptions.SalarieException;

public class Application {

    public static void main(String[] args) throws SalarieException {
        Hashtable dict = new Hashtable();

        Salarie s;
        try {
            s = new Salarie(5, 8, 14, "yyyyyyyyyyyyyyyyy", 1500);
            Integer key = new Integer(s.getM_nMatricule());
            dict.put(key, s);

            s = new Salarie(3, 1, 20, "Isodore DUMARC", 10000);
            dict.put(key, s);
            
            s = new Commercial(6, 2, 30, "Mathieu LEBLOND", -17000, 52000, 9);
            dict.put(key, s);
        } catch (SalarieException se) {
            System.err.println(se);
        }
        
        // Ici on ajoute chaque élement dict.element() à l'Enumeration
        for (Enumeration e = dict.elements(); e.hasMoreElements();) {
            Salarie sal = (Salarie) e.nextElement();
            System.out.println(sal);
            System.out.println(sal.calculSalaire());
        }
    }
}
package fr.xxxx.exceptions;

import fr.xxxx.yyyy.Salarie;

public class SalarieException extends Exception {
    public SalarieException(Salarie salarie) {
        super();
    }

    public String toString(){
        return super.toString() 
                + "\nLe salaire ne peut être que positif.";
    }
}

L'erreur se trouve à la ligne 24 à
catch (SalarieException se)

5 réponses

Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
4
Dans la classe Salarie :
public Salarie(int m_nMatricule, int m_nCategorie, int m_nService, String m_strNom, double m_dSalaire) throws SalarieException {
    super();
    System.out.println("Création du salarié : "+m_strNom);
    this.m_nMatricule = m_nMatricule;
    this.m_nCategorie = m_nCategorie;
    this.m_nService = m_nService;
    this.m_strNom = m_strNom;
    if(this.m_dSalaire < 0) {
        SalarieException se = 
                new SalarieException(this);
    } else this.m_dSalaire = m_dSalaire;
    this.m_nCount = m_nCount + 1;
}


Dans la classe Commercial:
public Commercial(int nMat, int nCatg, int nServ, String strNom, double dSal, double dChiffre,
        int dCommission) throws SalarieException {
    super(nMat, nCatg, nServ, strNom, dSal);
    this.m_dChiffreAffaire = dChiffre;
    this.m_pcCommission = dCommission;
}
Messages postés
16061
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
2 697
Avec ce code il ne devrait pas y avoir d'erreur dans ton programme, ni sur le catch indiqué, ni ailleurs.

Alors quel est le message de l'erreur que tu as ?

Remarque : pour lever une exception il ne faut pas juste faire un new, il faut surtout faire un throw :
if(this.m_dSalaire < 0) {
    throw new SalarieException(this);
}
Messages postés
16061
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
2 697
Bonjour,

Tu ne peux pas catch une SalarieException si dans le bloc try tu n'appelles aucun code qui throws cette SalarieException.
Tu ne nous as pas copier le code des classes Salarie et Commercial donc on ne peut pas voir comment elles sont faites, mais leurs constructeurs devraient throws SalarieException pour que ton try/catch ait un sens.

public Salarie(int a, int b, int c, String d, int e) throws SalarieException {
    if (...)
        throw new SalarieException(this);
}


Remarque : Hashtable et Enumeration sont de très vieilles classes Java 1.0 (1996) qui ne devraient plus être utilisées depuis Java 1.2 (1998) quand ont été ajoutées HashMap et Iterator.
Tu as donc plus de 20 ans de retard sur la technologie Java et il ne m'apparaît pas judicieux de coder en 2020 avec un langage Java aussi rustique qu'il ne l'était il y a 20 ans.
Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
4
Ok mais quand je met un salaire négatif, l'exception SalarieException n'est pas levée. Aucun message d'erreur
Messages postés
16061
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
2 697
C'est parce que au moment du test
if(this.m_dSalaire < 0)
la valeur
this.m_dSalaire
vaut zéro (valeur par défaut) car l'affectation
this.m_dSalaire = m_dSalaire
n'est pas faite.

Il faudrait soit faire l'affectation avant :
this.m_dSalaire = m_dSalaire;
if(this.m_dSalaire < 0) {
    throw new SalarieException(this);
}

Soit faire la comparaison sur la valeur passée en paramètre :
if (m_dSalaire < 0) {
    throw new SalarieException(this);
} else this.m_dSalaire = m_dSalaire;

La première manière a l'avantage d'avoir un
new SalarieException(this)
avec this qui contient la valeur du salaire qui pose problème, pour un meilleur traitement de l'exception derrière, mais si la deuxième manière est plus cohérente car elle bloque complètement d'avoir un salaire négatif.
Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
4
ça ne marche pas, déjà il souligne en rouge quand je met throw à throw new SalarieException(this);

Pour votre 2ème proposition cad :
if (m_dSalaire < 0) {
throw new SalarieException(this);
} else this.m_dSalaire = m_dSalaire;

Il me renvoit juste le salaire est 0 si je le met en négatif mais ne retourne pas la valeur de toString().
ps: la premièreproposition ne fonctionne pas, il affiche quand même le salaire négatif
Messages postés
16061
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
2 697
"déjà il souligne en rouge quand je met throw à throw new SalarieException(this);"
Souligné en rouge signifie qu'il y a une erreur, mais il faut survoler le code correspondant pour voir s'afficher le détail de l'erreur, ce qui aide généralement à la corriger, notamment grâce aux éventuelles propositions qui s'affichent.

Exemple :

Avec les différentes parties de code que j'ai recombiné suite à nos échanges, j'ai un programme de test qui fonctionne, que ce soit avec l'une ou l'autre des deux méthodes indiquées.
public Salarie(int m_nMatricule, int m_nCategorie, int m_nService, String m_strNom, double m_dSalaire) throws SalarieException {
    super();
    System.out.println("Création du salarié : "+m_strNom);
    this.m_nMatricule = m_nMatricule;
    this.m_nCategorie = m_nCategorie;
    this.m_nService = m_nService;
    this.m_strNom = m_strNom;
    if (m_dSalaire < 0) {
        throw new SalarieException(this);
    } else {
        this.m_dSalaire = m_dSalaire;
    }
    this.m_nCount = m_nCount + 1;
}

public Salarie(int m_nMatricule, int m_nCategorie, int m_nService, String m_strNom, double m_dSalaire) throws SalarieException {
    super();
    System.out.println("Création du salarié : "+m_strNom);
    this.m_nMatricule = m_nMatricule;
    this.m_nCategorie = m_nCategorie;
    this.m_nService = m_nService;
    this.m_strNom = m_strNom;
    this.m_dSalaire = m_dSalaire;
    if (this.m_dSalaire < 0) {
        throw new SalarieException(this);
    }
    this.m_nCount = m_nCount + 1;
}
Messages postés
48
Date d'inscription
vendredi 10 octobre 2014
Statut
Membre
Dernière intervention
18 août 2020
4
Ah oui ça marche c'est moi qui avais ajouté un mauvais code, merci