Au cas où on ne disposerait pas d'un compilateur compatible JDK 1.4, on peut obtenir
quasiment le même comportement avec les exceptions.
L'avantage des assertions sur les exceptions est que les assertions peuvent être désactivées
à la compilation ou à l'exécution.
class CompteurNBits {
private int etat;
private byte n;
/** @param n nombre de bits pour coder l'état, 0 < n < 31 */
CompteurNBits(byte n) {
if ((n <= 0) || (n > 30))
throw new RuntimeException("0 < n < 31");
this.n = n;
}
/** @param n nombre de bits pour coder l'état, 0 < n < 31
* @param etat valeur initiale de l'état, 0 ≤ etat < 2n*/
CompteurNBits(int etat, byte n) {
this(n);
if ((etat < 0) || (etat >= (1 << n))
throw new RuntimeException("0 ≤ etat < 2n");
this.etat = etat;
}
Attention, alors qu'avec les assertions, la condition à donner est l'invariant
que l'on souhaite vérifier, avec le if combiné aux exceptions, il faut mettre
l'opposé de l'invariant. Une raison de plus de préférer les assertions lorsque c'est possible.
Néanmoins, les exceptions constituent un mécanisme puissant sur lequel nous aurons l'occasion de revenir.