Le throws/throw (spécification)

Objectifs

  • Comprendre comment utiliser le mot-clé throws du gestionnaire d'exception pour la spécification des exceptions

  • Comprendre l'utilisation du mot-clé throw pour la levée d'exceptions

Mise en situation

Nous savons déjà comment capturer et gérer les exceptions. Parfois, il est approprié que la méthode ne fasse que spécifier les exceptions qui peuvent s'y produire et déléguer la gestion aux autres méthodes.

SyntaxeThrows

Le mot-clé throws permet de spécifier les types d'exceptions qu'une méthode peut générer.

Cela ne lève pas d'exception. Il spécifie qu'il peut se produire une exception dans la méthode. Il est toujours utilisé avec la signature de méthode.

Ainsi, cela permet à une méthode de déléguer la gestion de l'exception via le mécanisme de try...catch à une méthode plus haut dans la pile d'appels.

Si une méthode ne gère pas d'exceptions, le type d'exceptions qui peuvent s'y produire doit être spécifié dans la clause de mot-clé throws dans la déclaration de la méthode afin que les méthodes situées plus haut dans la pile d'appels puissent les gérer ou les spécifier.

1
method (Arguments) throws Exception1,Exception2,Exception,... { ... }

Exemple

Reprenons l'exemple du programme qui lit un fichier passé en paramètre qui est susceptible de générer une exception si le fichier est introuvable.

1
import java.io.File;
2
import java.io.FileInputStream;
3
import java.io.FileNotFoundException;
4
5
public class FileNotFoundStudi {
6
7
    public static void findFile() throws FileNotFoundException {
8
        // code that may produce IOException
9
        File newFile = new File("fichierExistant.txt");
10
        FileInputStream stream = new FileInputStream(newFile);
11
    }
12
13
    public static void main(String[] args) {
14
        try {
15
            findFile();
16
        } catch (FileNotFoundException e) {
17
            System.out.println(e);
18
        }
19
    }
20
}
1
C:\>javac FileNotFoundStudi.java
2
java.io.FileNotFoundException: fichierExistant.txt (Le fichier spécifié est introuvable)

Ici, la méthode findFile( ) spécifie qu'une exception de type FileNotFoundException peut être levée. La méthode main() appelle cette méthode et gère l'exception si elle est levée.

SyntaxeThrow

Le mot-clé throw permet de lever explicitement une exception vérifiée ou non vérifiée.

1
throw new Exception("Exception message");

ExempleLevée d'une exception vérifiée

Reprenons encore une fois notre exemple de programme qui tente de lire son fichier.

1
import java.io.FileNotFoundException;
2
3
public class FileNotFoundStudi {
4
5
    public static void findFile() throws FileNotFoundException {
6
        throw new FileNotFoundException("File not found Studi new exception!");
7
    }
8
9
    public static void main(String[] args) {
10
        try {
11
            findFile();
12
            System.out.println("Le reste du code dans le bloc try qui ne s'exécutera pas si l'exception ci-dessus est interceptée");
13
        } catch (FileNotFoundException e) {
14
            System.out.println(e);
15
        }
16
    }
17
}
1
C:\>javac FileNotFoundStudi.java
2
java.io.FileNotFoundException: File not found Studi new exception!

La méthode findFile( ) lève une exception de type FileNotFoundException avec le message que nous avons passé à son constructeur de la méthode FileNotFoundException( ).

Notez que puisqu'il s'agit d'une exception vérifiée, nous devons la spécifier dans la clause du mot-clé throws.

ExempleLevée d'une exception non vérifiée

On veut qu'un programme lève une exception si l'âge est inférieur à 18 ans (imprimez « Accès refusé aux mineurs ! »). Si l'âge est supérieur à 18 ans ou plus, imprimez « Accès autorisé car vous avez l'âge requis ! » :

1
public class Main {
2
    static void checkAge(int age) {
3
        if (age < 18) {
4
            throw new ArithmeticException("Accès refusé aux mineures!");
5
        }
6
        else {
7
            System.out.println("Accès autorisé car vous avez l'âge requis!");
8
        }
9
    }
10
11
    public static void main(String[] args) {
12
        try {
13
            checkAge(15); // Set age to 15 (which is below 18...)
14
        } catch (ArithmeticException e) {
15
            System.out.println(e);
16
        }
17
    }
18
}
1
C:\>javac Main.java
2
java.lang.ArithmeticException: Accès refusé aux mineurs!

La méthode checkAge(int age) lève une exception de type ArithmeticException avec le message que nous avons passé à son constructeur de la méthode ArithmeticException( ).

Notez que puisqu'il s'agit d'une exception non vérifiée, nous ne sommes pas obligés de la spécifier dans la clause du mot-clé throws.

SyntaxeÀ retenir

  • Le mot-clé throws est utilisé pour spécifier les exceptions pouvant survenir lors de l'exécution d'un programme

  • le mot-clé throw est utilisé pour lever une nouvelle exception et la lancer dans le bloc catch.