Qu'est-ce que la gestion des exceptions?
- Répondre aux erreurs qui se produisent lors de l'exécution de l'application
 
- Exception au sens strict: une erreur qui ne peut être exclue sous la responsabilité du développeur
 
- Le fichier n'existe pas
 
- Le DB de destination de la connexion a été arrêté
 
- Java doit gérer ces erreurs
 
- ** L'exception est le type (classe) **
 
- ** Représenté comme une hiérarchie de classes avec des exceptions générales en tant que classes supérieures et des exceptions dans des situations individuelles en tant que classes inférieures **
 
essayez ... capturez la syntaxe
- ** Try block **: traitement original
 
- ** catch block **: Appelé par type d'exception
 
- Exception levée = ** Exception levée **
 
- Accédez à l'objet d'exception via la ** variable d'exception spécifiée (e ou ex) **
 
- Puisque la portée est définie en unités de bloc, le même nom de variable (e) est OK même s'il y a plusieurs blocs catch.
 
- Méthode de classe d'exception
 
- ** getMessage () **: Obtenir un message d'erreur
 
- ** getLocalizedMessage () **: Obtenir un message d'erreur localisé
 
- ** getCause () **: Obtenez la cause de l'erreur
 
- ** getStackTrace () **: Récupère la trace de la pile
 
- ** printStackTrace () **: sortie de trace de pile
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TryBasic {
  public static void main(String[] args) {
    try {
      var in = new FileInputStream("C:/data/nothing.gif");
      var data = -1;
      while ((data = in.read()) != -1) {
        System.out.printf("%02X ", data);
      }
    //Lancer une exception FileNotFoundException dans la classe FileInputStream
    } catch (FileNotFoundException e) {
      System.out.println("Le fichier est introuvable.");
    } catch (IOException e) {
      //Accédez à l'objet d'exception via la variable d'exception spécifiée (e)
      e.printStackTrace();
    }
  }
}
Trace de la pile
- ** Historique des méthodes avant que l'exception ne se produise **
 
- Enregistrez dans l'ordre des appels à partir de la méthode principale, qui est le point d'entrée.
 
- Vérifiez si une méthode involontaire est appelée et si le processus est correct
 
enfin bloquer
- Le dernier bloc à exécuter avec ou sans exceptions
 
- Traitement des ressources utilisées dans le bloc try, etc.
 
- Enfin un seul bloc
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TryFinally {
  public static void main(String[] args) {
    FileInputStream in = null;
    try {
      in = new FileInputStream("C:/data/nothing.gif");
      var data = -1;
      while ((data = in.read()) != -1) {
        System.out.printf("%02X ", data);
      }
    } catch (FileNotFoundException e) {
      System.out.println("Le fichier est introuvable.");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      //Fermeture de dossier avec ou sans exception
      try {
        if (in != null) {
          in.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
syntaxe try-with-resource
- Recommandé car c'est plus simple que d'essayer ... enfin la syntaxe
 
- ** Vraiment inutile car les ressources sont automatiquement libérées lorsque le bloc try est quitté! ** **
 
- Remarque:
 
- ** Implémentez l'interface AutoCloseable **
* Reader/Writer/InputStream/OutputStream/Connection/Statement/ResultSet
 
- ** Modifications de l'ordre de lancement des ressources **
 
- Dans la syntaxe conventionnelle try ... finally, la ressource était vivante au moment du bloc catch
 
- Dans try-with-resource, la ressource est libérée lorsque le bloc try est quitté.
 
- ** Portée de ressources différente **
 
- La syntaxe try ...
 
- Dans try-with-resource, la portée est limitée à sous le bloc try (dans Java 9 ou version ultérieure, les ressources déclarées en dehors du bloc try peuvent être citées)
* 
var input = new FileInputStream(...)
* try(input){...} 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TryWithResources {
//Déclaration de ressource au début du bloc
  public static void main(String[] args) {
    try (var in = new FileInputStream("C:/data/hogee.gif")) {
      var data = -1;
      while ((data = in.read()) != -1) {
        System.out.printf("%02X ", data);
      }
    //Libération automatique des ressources lors de la sortie du bloc try
    } catch (FileNotFoundException e) {
      System.out.println("Fichier non trouvé.");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
Structure hiérarchique des classes d'exceptions
- Du point de vue de la hiérarchie de classes, toutes les classes d'exceptions / erreurs appartiennent à une arborescence hiérarchique avec ** Classe Throwable ** comme sommet.
 
- ** Classe d'erreur **: Erreur fatale ---- ** [Pas de gestion des exceptions] **
 
- Les erreurs subordonnées sont des ** exceptions d'erreur **
 
- IOErrer: erreur d'E / S grave, VirtualMachineError: échec au niveau de la machine virtuelle
 
- ** Classe d'exception ** ‥ ‥ ‥ ‥ ‥ ‥ ‥ ‥ ‥ ‥ ‥
 
- ** Classe RuntimeException ** ---- ** [Traitement des exceptions facultatif] **
 
- Les erreurs subordonnées sont des ** exceptions non contrôlées ** (= exceptions d'exécution)
 
- IllegalArgumentException: argument illégal, NullPointerException: l'objet est nul
 
- Les autres erreurs subordonnées sont des ** exceptions d'inspection **
 
- FileNotFoundException: le fichier n'existe pas, SQLException: problème lors de l'accès à la base de données
 
Remarques sur la gestion des exceptions
- ** Ne pas attraper avec exception **
 
catch (Exception e) intercepte toutes les exceptions 
- IOException FileNotFoundException plus spécifique
 
- ** Utilisez la multi-capture **
 
- Faites de même pour plusieurs exceptions
 
Exception 1 | Exception 2 (dans les deux cas) 
- ** ordre de bloc catch **
 
- S'il y en a plusieurs, la première description est prioritaire
 
- ** Écrivez d'abord les exceptions les plus faibles, les exceptions les plus élevées plus tard **
 
//Prise multiple
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class TryMulti {
  public static void main(String[] args) {
    try {
      var in = new FileInputStream("C:/data/nasi.gif");
      var data = -1;
      while ((data = in.read()) != -1) {
        System.out.printf("%02X ", data);
      }
      var uri = new URI( "https://www.neko.example.com");
      System.out.println(uri.toString());
    //Prise multiple
    } catch (IOException | URISyntaxException e) {
      System.out.println("Impossible d'accéder au fichier.");
      e.printStackTrace();
    }
  }
}
Lancer une exception
- En plus de lancer des bibliothèques standard ** Les développeurs peuvent lancer **
 
- Vous pouvez passer n'importe quel objet d'exception avec `throw exception object '
 
- ** Déclarez les exceptions qui peuvent être levées dans la clause throws **
 
- throw: lancer une exception
 
- throws: Déclaré dans la méthode / le constructeur
 
public FileInputStream(File file) throws FileNotFoundException{
//Abréviation
Exception lancer l'attention
- ** Ne lancez pas d'exception **
 
- ** Sélectionnez correctement les exceptions cochées / non cochées **
 
- Utilisez des ** exceptions standard ** autant que possible
 
- ** NullPointerException **: l'objet est nul
 
- ** IndexOutOfBoundsException **: l'index du tableau est hors de portée
 
- ** UnsupportedOperationException **: l'opération de requête n'est pas prise en charge
 
- ** IllegalArgumentException **: Problème avec l'argument passé à la méthode
 
- ** IllegalStateException **: méthode appelée lorsqu'elle n'est pas dans l'état prévu
 
- ** ArithmeticException **: Une condition exceptionnelle se produit dans le calcul
 
- ** NumberFormatException **: format numérique incorrect
 
- méthode privée utilise ** instruction assert **
 
- Exception AssertionError lorsque l'expression conditionnelle est fausse
 
- Fonctionne uniquement lorsque l'option 
-ea est spécifiée dans la commande java 
public class AssertBasic {
  private static double getTrapezoidArea(double upper, double lower, double height) {
    //Une exception se produit lorsque l'argument est égal ou inférieur à 0
    assert upper > 0 && lower > 0 && height > 0;
    return (upper + lower) * height / 2;
  }
  public static void main(String[] args) {
    System.out.println(AssertBasic.getTrapezoidArea(-2, 4, 0));
  }
}
Relance d'exception
- Ne pas traiter sur place ** Laisser le processus à l'appelant **
 
- Fondamentalement, au lieu d'un traitement individuel sur place, un traitement individuel doit être appelé et le flux de l'application elle-même doit être contrôlé.
 
- Le type d'exception peut être jugé judicieusement (Java7 ~)
 
- Seul le type d'exception peut être déclaré avec des lancers
 
- Pas besoin de multi-prises
 
public class TryRethrow {
//MySampleException,La méthode de relance peut se produire dans MyLibException
  public static void rethrow(boolean flag) throws MySampleException, MyLibException {
    try {
      if (flag) {
        throw new MySampleException();
      } else {
        throw new MyLibException();
      }
    //Recevoir avec le type d'exception et relancer tel quel
    } catch (Exception e) {
      throw e;
    }
  }
}
Exception de traduction
- ** Collectez les exceptions individuelles une fois, regroupez-les en tant qu'exceptions d'applications de niveau supérieur et relancez **
 
- Les exceptions peuvent être regroupées en exceptions spécifiques à l'application
 
- L'appelant ne doit pas être conscient des exceptions individuelles, ** doit être conscient des exceptions de niveau supérieur **
 
- Pour obtenir la cause d'origine de l'exception supérieure traduite ** méthode 
getCause **
 
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
//Il vous suffit de connaître MySampleException en tant qu'exception de traduction
public class UseTrans {
  public void readHttpPages() throws MySampleException {
    try (var reader = Files.newBufferedReader(Paths.get("C:/data/link.txt"))) {
      var line = "";
      while ((line = reader.readLine()) != null) {
        var client = HttpClient.newHttpClient();
        var req = HttpRequest.newBuilder().uri(URI.create(line)).build();
        var res = client.send(req, HttpResponse.BodyHandlers.ofString());
        System.out.println(res.body());
      }
    } catch (IOException | InterruptedException e) {
      throw new MySampleException(e);
    }
  }
}
Classe d'exception propriétaire
- Les classes d'exception peuvent être définies dans l'application
 
- ** Exception d'héritage (classe dérivée) **
 
- ** Remplacement du constructeur **
 
- Redéfinissez le constructeur défini par Exception et appelez super OK
 
- Des exceptions avec des implémentations uniques de champs et de méthodes sont possibles
 
//Inherit Exception (classe dérivée)
public class MySampleException extends Exception {
  //Remplacer le constructeur
  public MySampleException() {
    super();
  }
  public MySampleException(String message) {
    super(message);
  }
  public MySampleException(String message, Throwable cause) {
    super(message, cause);
  }
  public MySampleException(Throwable cause) {
    super(cause);
  }
}