Qu'est ce qu'un AssertionError? Dans quel cas dois-je le jeter de mon propre code?

dans le point 2 du livre" Java efficace, 2e édition", il y a cet extrait de code, dans lequel l'auteur veut interdire l'initialisation vide d'un objet.

class Example {
    private Example() {
        throw new AssertionError();
    }
}

le type d'exception lancée, c'est ce qui me confond ici.

Je ne comprends pas si le AssertionError est lancé juste à cause d'une absence d'erreurs plus appropriées ou parce que cela devrait être ainsi.

si je comprends bien, cette erreur est lancée par le cadre quand une déclaration assert échoue. Aussi, dans le javadoc il est juste écrit

[Un AssertionError est Levée pour indiquer qu'une affirmation a échoué.

mais je ne vois aucune assertion (vraie-fausse déclaration) être violée ici. Bien sûr ,la déclaration "vous ne devez pas instancier un élément de cette classe" a été violée, mais si c'est la logique derrière cela, alors nous devrions tous jeter AssertionError s partout, et ce n'est évidemment pas ce qui se passe.

FWIW, je viens de lancer un

new IllegalStateException("Must not instantiate an element of this class")

y a-t-il un problème avec ça? Dans quel cas dois-je lancer un AssertionError dans mon propre code?

désolé si c'est juste un doute subtil mais j'utilise ce modèle beaucoup dans mon code et je veux m'assurer que je fais la bonne chose.

48
demandé sur doplumi 2014-07-21 14:43:53

4 réponses

bien sûr, la déclaration "vous n'instancierez pas un élément de cette classe" a été violée, mais si c'est la logique derrière cela, alors nous devrions tous jeter AssertionErrors partout, et ce n'est évidemment pas ce qui se passe.

le code ne dit pas que l'utilisateur ne devrait pas appeler le constructeur zero-args. L'affirmation est là pour dire que tant que le programmeur est conscient, il/elle a fait impossible d'appeler le constructeur zero-args (dans ce cas en le faisant private et en ne l'appelant pas de l'intérieur du code Example ). Et donc si un appel se produit, cette affirmation a été violée, et donc AssertionError est approprié.

35
répondu T.J. Crowder 2014-08-01 21:25:40

la signification d'un AssertionError est que quelque chose s'est produit que le développeur pensait impossible d'arriver.

Donc si un AssertionError est jamais jeté, c'est un signe clair d'une erreur de programmation.

27
répondu Henry 2014-07-21 10:52:08

une erreur d'affirmation est lancée quand dire "Vous avez écrit un code qui ne devrait pas s'exécuter à tout prix parce que selon vous logique, il ne devrait pas se produire. Mais si cela arrive, Lancez AssertionError. Et vous n'avez pas l'attraper."Dans un tel cas, vous lancez une erreur D'affirmation.

new IllegalStateException("Must not instantiate an element of this class")' // Is an Exception not error.

Remarque: l'Erreur d'Assertion vient en java.lang.Erreur et erreurs non destinées à être attrapées.

14
répondu Oliver 2014-07-21 10:54:21

AssertionError est une Exception non contrôlée qui s'élève explicitement par programmeur ou par développeur API pour indiquer que la déclaration assert échoue.

assert(x>10);

sortie:

AssertionError

Si x n'est pas supérieur à 10 alors vous obtiendrez l'exception runtime en disant AssertionError.

0
répondu Raman Gupta 2017-10-02 10:12:03