Dans l'article 2 du livre "Effective Java, 2nd edition", il y a cet extrait de code dans lequel l'auteur souhaite interdire l'initialisation à vide d'un objet.
class Example {
private Example() {
throw new AssertionError();
}
}
Le type d'exception levée est ce qui me trouble ici.
Je ne comprends pas si la variable AssertionError
est générée simplement à cause d'une absence d'erreurs mieux adaptées ou parce que cela devrait être ainsi.
Si j'ai bien compris, cette erreur est générée par le framework lorsqu'une instruction assert
échoue. De plus, dans le javadoc, c'est écrit
[Une erreur d'assertion est] levée pour indiquer qu'une assertion a échoué.
Mais je ne vois aucune affirmation (affirmation vraie-fausse) violée ici . Bien sûr, l’énoncé "Vous ne devez pas instancier un élément de cette classe" a été violé, mais si telle est la logique, nous devrions tous jeter AssertionError
s partout, et ce n’est évidemment pas ce qui se produit.
FWIW, je viens de jeter un
new IllegalStateException("Must not instantiate an element of this class")
Y a t il un problème avec ça? Dans quel cas devrais-je insérer une AssertionError
dans mon propre code?
Désolé si ce n'est qu'un doute subtil, mais j'utilise beaucoup ce modèle dans mon code et je veux m'assurer que je fais la bonne chose.
Bien sûr, la déclaration "Vous ne devez pas instancier un élément de cette classe" a été violée, mais si telle est la logique, nous devrions tous jeter
AssertionErrors
partout, et ce n’est évidemment pas ce qui se produit.
Le code ne dit pas que l'utilisateur ne devrait pas appeler le constructeur zero-args. L’affirmation est là pour dire que, pour autant que le programmeur sache, il/elle a fait en sorte qu’il appelle impossible appeler le constructeur zero-args (dans ce cas, en le rendant private
et en ne l’appelant pas de l'intérieur de Example
code). Et donc, si un appel se produit, cette assertion a été violée, et donc AssertionError
est approprié.
La signification d'une AssertionError
est que quelque chose s'est passé que le développeur pensait impossible.
Donc, si une AssertionError
est lancée, cela indique clairement une erreur de programmation.
Une erreur d'assertion est émise lorsque vous dites "Vous avez écrit un code qui ne devrait pas être exécuté à tout prix, car selon votre logique, cela ne devrait pas arriver. MAIS si cela se produit, lancez AssertionError. Et vous ne l'attrapez pas." Dans ce cas, vous générez une erreur d'assertion.
new IllegalStateException("Must not instantiate an element of this class")' // Is an Exception not error.
Remarque: L'erreur d'assertion relève de Java.lang.Error et les erreurs non destinées à être interceptées.
Je suis vraiment en retard pour faire la fête ici, mais la plupart des réponses semblent porter sur les tenants et les aboutissants de l'utilisation d'assertions en général, plutôt que d'utiliser AssertionError
en particulier.
assert
et throw new AssertionError()
sont très similaires et servent le même objectif conceptuel, mais il existe des différences.
throw new AssertionError()
lève l'exception, que les assertions soient activées ou non pour le jvm (c'est-à-dire via le commutateur -ea
).throw new AssertionError()
quittera le bloc. Son utilisation vous permettra donc d'éviter certaines erreurs de compilation, comme assert
.Par exemple:
{
boolean b = true;
final int n;
if ( b ) {
n = 5;
} else {
throw new AssertionError();
}
System.out.println("n = " + n);
}
{
boolean b = true;
final int n;
if ( b ) {
n = 5;
} else {
assert false;
}
System.out.println("n = " + n);
}
Le premier bloc, ci-dessus, compile parfaitement. Le second bloc ne compile pas car le compilateur ne peut pas garantir que n
a été initialisé au moment où le code tente de l’imprimer.
AssertionError est une exception non contrôlée qui apparaît explicitement par le programmeur ou par le développeur de l'API pour indiquer que l'instruction assert échoue.
assert(x>10);
Sortie:
AssertionError
Si x n'est pas supérieur à 10, vous obtiendrez une exception d'exécution indiquant AssertionError.