web-dev-qa-db-fra.com

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

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 AssertionErrors 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.

53
doplumi

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é.

36
T.J. Crowder

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.

29
Henry

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.

14
Oliver

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.

  1. 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).
  2. Le compilateur sait que 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.

1
Matthew McPeak

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.

0
Raman Gupta