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 :

[Débutant] Intérêt et différence de throws/throw


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 56
    Par défaut [Débutant] Intérêt et différence de throws/throw
    Bonjour,
    Je ne comprends pas vraiment l'intérêt de throws/throw. Par exemple, si j'ai ça :
    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
    class X {
     
        public static void main(String[] a) {
     
            int i = 10, j = 0;
            try {
                System.out.println(Y.m(i,j));
            }
            catch (ArithmeticException e) {
                System.out.println("catched");
            }
        }
    }
     
     
    class Y {
     
        static double m(int i, int j) {
            return i/j;
        }
     
    }
    ... quel et l'intérêt d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        static double m(int i, int j) throws ArithmeticException {
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Y {
     
        static double m(int i, int j) {
            if (j == 0) throw new ArithmeticException();
            return i/j;
        }
     
    }
    J'ai cru comprendre aussi qu'il fallait mettre throws dans la méthode susceptible de générer l'erreur et throw à l'endroit où l'erreur est détectée, mais pour moi ça n'est qu'une différence de syntaxe. Quelle est la différence "conceptuelle" (pour ainsi dire) entre throw et throws ?

    Merci pour vos éclaircissements (les exams sont la semaine prochaine ^^)

    ++

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    rapidement:

    -throw sert à lancer l'exception
    -throws sert à indiquer qu'une méthode est succeptible de lever une exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // méthode m, peut lever des NullPointerException si o est null
    void m(Object o) throws NullPointerException {
      if(o==null)
        // o est null, lancement de l'exception
        throw new NullPointerException(); 
     
      ...
    }

  3. #3
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    throws ---> tu ne pourras pas traiter l'erreur, dès qu'elle apparait on sort de la méthode
    throw (accompagné d'un new Exception)---> tu "génères" une erreur, tu la lances..

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par pollux007
    throws ---> tu ne pourras pas traiter l'erreur, dès qu'elle apparait on sort de la méthode
    hum.... non c'est pas ça !

    puisque tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void m() throws Exception {
      try {
        ...
      } catch(Exception e) {
        // Traitement local de l'exception
        System.err.println("Oops");
        throw e;
      }
    }

  5. #5
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Autant pour moi!

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,



    Déjà il s'agit d'un cas particulier, car ArithmeticException est une RuntimeException...



    Explication :
    Pour pouvoir renvoyer une Exception avec throw, elle doit obligatoirement être déclaré dans la signature de la méthode avec throws, sinon le compilateur affichera une erreur. Ainsi le code suivant ne peut pas compiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        static double m(int i, int j) {
            if (j==0) throw new Exception();
            return i/j;
        }
    Tu es obligé de déclaré que la méthode renvoit une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        static double m(int i, int j) throws Exception {
            if (j==0) throw new Exception();
            return i/j;
        }
    Le fait de déclaré une exception dans la signature de la méthode indique au compilateur que la méthode peut renvoyer une exception, et il obligera les developpeurs qui utilisent cette exception à la traiter (ou à la renvoyer)...



    Maintenant les RuntimeException sont un cas particuliers parmis les exceptions, puisqu'elles n'ont pas besoins d'être déclaré ni traité...
    En effet, il s'agit d'exception relative aux erreurs de programmation, et qui ne devrait normalement pas arriver... Si on devait toutes les traiter on se retrouvera avec des try/catch partout ce qui rendrait le tout complètement illisible...


    Donc le compilateur permet qu'on ne traite pas ces exceptions, et du coups lorsqu'elle surviennent elle remonte toute la pile d'exécution et font planter le programme...





    Donc pour les RuntimeException le throws est inutile... mais il est bien de le préciser car cela indique aux developpeurs qui utilisent la méthode qu'elle peut renvoyer une tel exception. Il est bien également de le préciser dans l'entête de la javadoc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         /**
         * ...
         * @throws ArithmeticException si j == 0
         */
        public static double m(int i, int j) throws ArithmeticException {
            return i/j;
        }



    Enfin pour finir, la vérification de la valeur de j comme dans ton dernier exemple est inutile (dans ce cas bien précis) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        static double m(int i, int j) {
            if (j == 0) throw new ArithmeticException();
            return i/j;
        }
    En effet, si j==0, alors il y aura une ArithmeticException renvoyé par i/j, cela ne sert donc a rien de le vérifier avant si c'est pour renvoyer la même exception...



    J'espère avoir été clair...

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 56
    Par défaut
    Re, merci à tous pour vos éclaircissements ! Je n'avais lu nulle part le cas particulier des Exceptions Runtime, aussi merci à adiGuba de l'avoir signalé.

    Je crois que j'ai compris l'idée : si les exceptions ont catchées (désolé pour l'anglicisme) en amont, les indiquer throws ne rajoute rien, MAIS pour forcer les collègues programmeurs à catcher les exceptions, on précise qu'elles peuvent en lever. En gros : je fais une classe A qui peut lever une exception E, et Jackie, dans le bureau d'à côté, écrit une classe B qui utilise la classe A. Comme je ne vais pas m'amuser à relire le code de Jackie, mais que je veux être sûr qu'il a bien prévu de gérer l'exception E, je rajoute "throws blah blah blah" à mes méthodes - une manière de lui forcer la main.

    Quand à la différence entre throws et throw, je pense aussi que je la vois mieux. Ici throw est inutile parce l'exception va de toute façon être levée, mais parfois il faut forcer la levée de l'exception, par exemple si j'écris une classe CompteEnBanque je peux vouloir forcer (avec throw) la levée l'exception ImpossibleDeDébiterLeCompteCarDécouvertInterdit - et java ne le fera pas automatiquement ; il ne peut pas lire dans mes pensées.

    C'est bien ça ?

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

Discussions similaires

  1. la différence entre @throws et @exception du JavaDoc
    Par aroussi_sanaa dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2009, 17h15
  2. Exceptions throws throw
    Par jeremypd dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 08/06/2008, 23h22
  3. différence entre Throws et Throw
    Par bonjour69 dans le forum Langage
    Réponses: 6
    Dernier message: 08/10/2006, 22h35
  4. Réponses: 3
    Dernier message: 07/04/2006, 11h27
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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