Java Throws

Résolu
Glory8 Messages postés 9 Statut Membre -  
Skymer Messages postés 565 Statut Membre -
Bonjour,

Quelqu'un pourrait m'expliquer l'utilité de throws dans un programme java ? pourquoi l'utiliser ?

est ce qu'il a le meme role qu'un try/catch ?

Merci

3 réponses

  1. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    Bonjour

    Throws permet de traiter une exception non pas dans la méthode où elle se produit, mais dans la méthode appelante.

    0
    1. Glory8 Messages postés 9 Statut Membre
       
      Bonjour,

      Merci pour votre réponse rapide, je peu donc eviter de faire un appel a un try/catch si je met un throws dans la méthode qui contient le throw ?
      0
    2. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
       
      il faudra quand même gérer l'exception. ne connaissant pas votre code, difficile d'en dire plus.

      Chouba, Bibapeloula / Mon métier est tellement secret que je ne sais même pas ce que je fais.
      0
    3. Glory8 Messages postés 9 Statut Membre
       
      Je n'ai pas vraiment de code, enfin j'ai des exercices de ma fiche de TD qu'on a deja traité que je n'ai pas compris si vous voulez, en voici un bou :

      les programmes suivants comportes des erreurs, trouver ces erreurs et les expliquer :
      public void m1() {
      f();
      }
      public int f() throws Exception {
      throw new Exception();
      }

      2eme programme :

      public void m3(){
      try{
      }
      catch{Exception e){
      }
      catch (NullPointerException e){
      }
      }

      3eme programme :
      public void m4(){
      throw new CheckedException();
      }
      class CheckedException extends Exception {
      public CheckedException() {
      super();
      }
      }

      4eme programme :

      public void m6(){
      f();
      }
      public int f() {
      throw new RuntimeException();
      }
      0
    4. Glory8 Messages postés 9 Statut Membre
       
      je l'ai deja lu, j'ai bien saisie la partie traitant le catch/try/finaly et compris ce que fait throw mais pour throws je n'ai pas bien saisie :s
      0
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    C'est bien de parler des exceptions, mais il y a plusieurs cas, et il n'y a pas que ça. Alors reprenons :

    1) throw, throws et try/catch/finally sont liés à la classe Throwable

    Exemple :

    void f() throws Throwable {
        try {
            // ...
            if (...) {
                throw new Throwable();
            }
            // ...
        } catch (Throwable t) {
            // ...
        } finally {
            // ...
        }
    }

    2) On distingue deux comportements : checked et unchecked

    2a) Tous les Throwable checked doivent obligatoirement être traités par un try/catch ou par un throws

    2b) Les Throwable unchecked peuvent éventuellement être traités par un try/catch, le throws est dans tout les cas facultatif (et superflue ?)

    Remarque : même s'il est possible de les traiter, il est généralement déconseillé de traiter les Error ou les Throwable directement.

    3) L'arborescence de Throwable est la suivante :

    Throwable extends Object → checked
    Error extends Throwable → unchecked
    Exception extends Throwable → checked
    RuntimeException extends Exception → unchecked

    https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html
    https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html
    https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html
    https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html

    4) Exemples :

    4a) Un NullPointerException extends RuntimeException est unchecked, donc il n'est pas obligatoire de le traiter, mais ça peut servir.

    https://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

    4b) Une IOException extends Exception est checked, donc tout traitement qui fera une IOException devra être traité soit par un try/catch, soit par un throws.

    https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html

    4c) Un OutOfMemoryError extends Error est unchecked, donc il n'est pas obligatoire de le traiter et en général ce sera une mauvaise idée de le faire (ex: s'il n'y a plus de mémoire, c'est mort...)

    https://docs.oracle.com/javase/8/docs/api/java/lang/OutOfMemoryError.html

    5) L'appel d'une méthode qui a un throws se comporte de la même manière que si elle appelait directement le throw elle même.

    Exemple :

    void f() throws Exception {
        throw new Exception();
    }
    
    void g() {
        try {
            f();
        }
        catch (Exception e) {
        }
    }

    C'est pareil que :

    void f() {
    }
    
    void g() {
        try {
            throw new Exception();
        }
        catch (Exception e) {
        }
    }

    6) On peut utiliser try/finally sans catch, dans ce cas l'exception reste toujours à traiter (c'est le catch qui compte).

    Il y a encore quelques subtilités, comme le try-with-resources par exemple, mais tout est dans la documentation :
    https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

    Le mieux est encore de pratiquer et voir avec quelques exemples ce que l'on peut faire et ce que l'on ne peut pas faire...
    Ne pas oublier de regarder la documentation des Exception pour savoir si elles étendent RuntimeException ou pas.
    0
    1. Glory8 Messages postés 9 Statut Membre
       
      Merci pour votre réponse :)
      0
  3. Skymer Messages postés 565 Statut Membre 75
     
    Bonjour, throws, signifie que l'on devra entouré d'un bloc try/catch une méthode à risque exemple :
    public void exCCM()throws monExeption/*Indique que l’exception est à risque*/{
    //code...
    if (i == 2){
    throw monExeption //lancement de l’exception
    }

    0