Erreur sur les Exceptions personnalisées en JAVA

Résolu/Fermé
Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 - Modifié le 19 juil. 2020 à 10:14
Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 - 19 juil. 2020 à 23:41
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)
A voir également:

5 réponses

Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 5
Modifié le 19 juil. 2020 à 11:59
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;
}
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 19 juil. 2020 à 12:09
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);
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 juil. 2020 à 10:27
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.
0
Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 5
19 juil. 2020 à 14:52
Ok mais quand je met un salaire négatif, l'exception SalarieException n'est pas levée. Aucun message d'erreur
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 juil. 2020 à 15:39
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.
0
Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 5
19 juil. 2020 à 19:40
ç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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 juil. 2020 à 21:22
"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;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Anouchka2586 Messages postés 51 Date d'inscription vendredi 10 octobre 2014 Statut Membre Dernière intervention 20 mars 2022 5
19 juil. 2020 à 23:41
Ah oui ça marche c'est moi qui avais ajouté un mauvais code, merci
0