UP | HOME

Les exceptions

Pour plus de détails, cf. le tutoriel d'Oracle : http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html.

Le langage Java possède un mécanisme dit d'exceptions. Une exception survient lorsqu'une faute apparaît lors de l'exécution. Deux attitudes sont possibles face à une faute : ou bien elle est corrigée par une réaction exceptionnelle, ou bien elle ne l'est pas, et produit alors une erreur, aboutissant à la fin de l'exécution.

Les fautes peuvent être constatées par la machine virtuelle : exécutées par la machine virtuelle, elles se traduiraient par des erreurs, comme une division par zéro, ou l'appel d'une méthode à partir de la référence null. A la place des erreurs, la machine déclenche des exceptions, comme l'exception de la classe NullPointerException.

Les fautes peuvent être aussi constatées par le programmeur : exécutées, elles produiraient une erreur logique du point de vue du programmeur. Le programmeur peut à la place décider de déclencher une exception, à l'aide d'une instruction particulière : throw new X(msg), où la classe X est une sous-classe de la classe Exception de l'API. Cette instruction interrompt alors l'exécution et si la faute n'est pas corrigée, affiche le message msg, une chaîne de caractères de type String.

Il est toujours possible de corriger une faute en rattrapant une exception déclenchée par la machine ou le programmeur. On utilise alors l'instruction try/catch.

Table of Contents

Exceptions contrôlées et silencieuses

Les exceptions sont réparties en deux grandes catégories, celles contrôlées et celles silencieuses.

Les exceptions silencieuses sont celles appartenant à un sous-type de la classe RuntimeException pour les erreurs d'origine interne ou de la classe Error pour les erreurs d'origine externe : elles n'ont pas besoin d'être déclarées. Certaines exceptions bien connues appartiennent à cette catégorie et signalent une erreur à l'exécution.

RunTimeException
  ArrayStoreException
  ClassCastException
  ConcurrentModificationException
  EmptyStackException
  FileSystemNotFoundException
  IllegalArgumentException
  IllegalStateException, 
  IndexOutOfBoundsException
  NoSuchElementException
  NullPointerException
  UnsupportedOperationException

D'autres, plus rares, signalent un dysfonctionnement fatal.

Error
  IOError
  VirtualMachineError

Les exceptions contrôlées (par le compilateur) doivent être déclarées dans la signature de la méthode ou de la fonction si elles ne sont pas rattrapées par une construction try/catch : on ajoute alors une clause throws X.

void f(@@@) throws X {
  ...
    throw new X(...); 
  ...
}

Ces exceptions doivent être rattrapées à un moment ou à un autre : les erreurs associées doivent donc pouvoir être réparées ou compensées.

Traitement des exceptions

On utilise un bloc dit try/catch.

try{ 
  ... // code déclenchant l'exception 
} catch(X | Y e) { // rattrapage des exceptions de type X ou Y  
  ... // traitement de l'exception
} 

Il s'agit de la forme moderne, qui admet un type union pour l'exception (depuis Java 7). Auparavant, on utilisait deux clauses catch consécutives. Cette possibilité peut permettre de réaliser des factorisations de code.

On peut aussi ajouter un bloc finally qui s'exécutera à la sortie du bloc try, indépendamment de la nature de cette sortie, sortie normale sans erreur ou sortie exceptionnelle suite à une erreur. Ce bloc sert à libérer des ressources.

Last Updated 2015-05-07T08:36+0200. Comments or questions: Send a mail.