Types d'exception - 1

« Je voudrais te parler d'une autre chose, aujourd'hui. En Java, toutes les exceptions sont réparties en deux types : vérifiées et non vérifiées (celles qui doivent être capturées et celles qui n'ont pas à l'être). Par défaut, toutes les exceptions doivent être capturées. »

« Est-ce qu'on peut volontairement lever des exceptions dans son code ? »

« Tu peux lever n'importe quelle exception dans ton propre code. Tu peux même écrire tes propres exceptions. Mais nous reparlerons de ça plus tard. Pour l'instant, concentrons-nous sur les exceptions levées par la machine Java. »

« OK. »

« Si une exception ClassNotFoundException ou FileNotFoundException est levée (se produit) dans une méthode, le développeur doit l'indiquer dans la déclaration de la méthode. Ce sont les exceptions vérifiées. Voici à quoi cela ressemble en général : »

Exemples d'exceptions vérifiées
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

« Alors on écrit juste 'throws' suivi d'une liste séparée par virgules d'exceptions, c'est ça ? »

« Oui. Mais ce n'est pas tout. Pour que le programme compile, la méthode qui appelle method1 dans l'exemple ci-dessous doit effectuer une de ces deux choses : soit capturer ces exceptions soit les propager (à l'appelant), en indiquant les exceptions propagées dans sa déclaration. »

« Je reprends. Si ta méthode main doit appeler une méthode dont la déclaration continent 'throws FileNotFoundException, …', tu dois effectuer une de ces deux choses :

1) Capturer FileNotFoundException, …

Tu dois intégrer le code appelant la méthode non sûre dans un bloc try-catch.

2) Ne pas capturer FileNotFoundException, …

Dans ce cas, tu dois ajouter ces exceptions à la liste après throws de ta méthode main. »

« Pourrais-tu me donner un exemple ? »

Regarde ceci : »

Exemples d'exceptions vérifiées
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

« Le code de cet exemple ne compile pas, car la méthode main appelle methode1(), qui lève des exceptions qui doivent être capturées. »

« Pour qu'il compile, tu dois ajouter la gestion des exceptions à la méthode main. Tu peux le faire d'une des deux façons suivantes : »

Option 1 : Tu propages simplement l'exception (à l'appelant) :
public static void main(String[] args)  throws FileNotFoundException, ClassNotFoundException
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

« Et ici nous la capturons avec un try-catch : »

Option 2 : Capturer l'exception :
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

« Ça commence à devenir plus clair. »

« Observe l'exemple suivant. Cela t'aidera à comprendre le reste. »

Au lieu de gérer les exceptions, nous les propageons aux méthodes qui se trouvent plus loin la pile et qui savent comment les gérer :
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Gérer une exception et en propager une autre :
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Capturer les exceptions, n'en propager aucune :
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("ClassNotFoundException has been caught.");
    }
}
3
Mission
Syntaxe Java,  niveau 9leçon 4
Bloqué
Saisie de code
Parfois, inutile de réfléchir, il suffit de le marteler ! Aussi paradoxal que cela puisse paraître, il arrive que tes doigts se « souviennent » mieux des choses que ton esprit conscient. C'est pourquoi la formation du centre secret CodeGym comprend parfois des tâches qui t'obligent à saisir le code. En saisissant le code, tu t'habitues à la syntaxe et tu gagnes un peu de matière noire. Et rien de mieux pour combattre la paresse !

« Il existe un autre type d'exception, RuntimeException, et les classes qui en héritent. Tu n'as pas besoin de les capturer. Ce sont des exceptions non vérifiées. Elles sont considérées difficiles à prédire. Tu peux les gérer de la même façon, mais tu n'as pas besoin de les indiquer dans une clause throws. »