Mis à jour le 12/10/2018
  • 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Générez votre première exception

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Finissons cette partie du cours avec un chapitre un peu moins long, à propos des exceptions.

Que se passe-t-il si on essaie de générer une facture sans produits ? C'est possible, mais le résultat est problématique :

HomeShop compagnie
1 Place Charles de Gaulle, 75008 Paris

Facture à l'attention de : 
Juste Leblanc
19 rue Germain Pilon, Paris

Mode de livraison : livraison point relais 2.99€

Produits : 
-----------------------------------------------------
Livraison : 2.99
-----------------------------------------------------
Total : 2.99

Nous allons empêcher cela en générant une exception !

Plusieurs types d'exceptions

Souvenez-vous, dans le premier cours consacré à Java, je vous ai montré qu'il existait 2 types d'exceptions :

  • certaines que l'on est obligé de catcher ;

  • d'autres que l'on catche si l'on veut.

Dans tous les cas, une exception non catchée va interrompre le programme.

La classe Exception et ses enfants représentent la première catégorie : les exceptions que l'on doit forcément catcher. Il en existe beaucoup intégrées dans Java. Vous pouvez les utiliser au besoin. En voici 2 exemples :

La classe RuntimeException est un enfant d'Exception. La différence, c'est que vous n'êtes pas obligé de catcher une  RuntimeException . Voici 3 exemples d'enfants de  RuntimeException  :

Pour lancer une exception, il suffit d'utiliser le mot clé  throw .

package com.cursan.miam;

public class Four {
    public void cuire(int temperature, int duree) {
        if (temperature < 40 || temperature > 250)
            throw new IllegalArgumentException("La température du four doit être comprise en 40 et 250 degrés");
        if (duree <= 0)
            throw new IllegalArgumentException("La durée doit être positive");
        System.out.println("Je cuis un plat à " + temperature + " degrés, pendant " + duree + " minutes.");
    }
}
public static void main(String[] args) {
    Four four = new Four();
    four.cuire(30, 15);
}

Si on exécute ce  main , cela donne :

Exception in thread "main" java.lang.IllegalArgumentException: La température du four doit être comprise en 40 et 250 degrés
 at com.cursan.miam.Four.cuir(Four.java:6)
 at com.cursan.homeshop.Main.main(Main.java:8)

Vos exceptions

Vous êtes libre d'utiliser les types d'exceptions déjà présents dans Java. Cependant, il est souvent plus judicieux de créer vos propres types d'exceptions.

Nous allons le faire pour notre facture :

package com.cursan.homeshop;

public class NoProductInBillException extends RuntimeException {
    
}

Il n'y a pas besoin de plus de code. On hérite juste de  RuntimeException . J'ai choisi  RuntimeException, car je veux que les développeurs qui utiliseront  Bill  puissent avoir le choix de catcher ou non l'exception. Peut-être feront-ils une vérification avant d'utiliser  generate ?

On ajoute un test dans  BillTest  pour être certain qu'une exception de type  NoProductInBillException  est levée si  products  est vide.

@Test
public void Given_emptyProductList_generatingBill_Then_throwsException() {
    Bill bill = new Bill(customer, lowCostRelayDelivery);
    assertThrows(NoProductInBillException.class, () -> bill.generate(writerMock));
}

On commit  ce test, puis on ajoute le code.

public void generate(Writer writer) {
    if (products.isEmpty())
        throw new NoProductInBillException();
    writer.start();
    ...
}
public static void main(String[] args) {
    Product cafe = new Product("Philips HD7866/61", "Philips SENSEO Quadrante, Noir - 1 ou 2 tasses", 79.99);
    Product tv = new Television("TV Samsung UE49MU6292", "Smart TV LED incurvée 49\"", 599, 49, "LED");
    Fridge fridge = new Fridge("BEKO TSE 1042 F", "Réfrigérateur BEKO 130L - Classe A+ - blanc", 189, 130, false);

    Customer customer = new Customer("Juste Leblanc", "19 rue Germain Pilon, Paris");
    
    Bill bill = new Bill(customer, new RelayDelivery(27));
    try {
        bill.generate(new FileWriter("facture_leblanc"));
    } catch (NoProductInBillException e) {
        System.err.println("Pas de produit dans la facture");
    }
}

Et voici le résultat :

Pas de produit dans la facture

Process finished with exit code 0

Le gros intérêt d'utiliser notre propre type d'exception est d'avoir une information claire pour les développeurs avec la ligne catch (NoProductInBillException e) . Un autre développeur comprendra immédiatement le type de souci qu'il peut y avoir à cet endroit du code.

Cette partie est terminée. On vient de voir les concepts d'héritage, de polymorphisme, d'interface et d'exceptions personnalisées.

Vous connaissez maintenant l'essentiel des outils qu'offre la programmation orientée objet. Vous êtes prêt à concevoir des applications variées grâce à ces différents outils.

Dans la partie suivante, on va transformer notre projet en projet web, pour qu'il soit affiché dans un navigateur !

Exemple de certificat de réussite
Exemple de certificat de réussite