8
votes

Qu'est-ce que le mot clé affirme signifie en Java?

J'ai vu quelque part dans le code GWT, c'était quelque chose comme ça xxx


0 commentaires

5 Réponses :


0
votes

Cela signifie que si l'affichage n'est pas un objet de type widget, vous obtiendrez une AssertionError avec la chaîne de texte qui suit l'affirmation. Les affirmations sont utiles pour le débogage.


2 commentaires

Donc, c'est juste utile lors du débogage, rien à voir avec l'exécution du code d'exécution, non?


Eh bien, cela ne devrait probablement pas être utilisé pour le flux de contrôle, si c'est ce que vous voulez dire. Si vos affirmations prouvent faussement dans votre produit final, je pense que cela signifie que vous êtes allé très mal quelque part!



13
votes

Le mot clé Affirmez code>, comme le nom l'indique, rend une assertion em> sur le code. Il est utilisé pour spécifier quelque chose qui détient vrai tout le temps - ou que, au moins, devrait être vrai!

Le mot clé code> est suivi d'une valeur booléenne ( vrai code> ou false code>), ou une expression, à évaluer au moment de l'exécution, qui renvoie un booléen. p> xxx pré>

si, pour une raison quelconque, le L'expression booléenne évalue en faux, puis un assertionError code> est lancé. p> xxx pré>

Lorsque vous l'utilisez, vous effectuez une déclaration claire sur l'état de votre programme. sur un point donné, qui peut faciliter la tâche des lecteurs de suivre votre code. P>

Il y a un paradigme de programmation appelé Programme par contrat STRY>, dans lequel les pièces de code font des déclarations sur le Pré-conditions qui doivent être réelles pour qu'ils s'exécutent correctement et les conditions postérieures, garanties de la réalité après leur exécution. Vous pouvez utiliser le mot-clé code> assert code> pour implémenter ceci. P>

Par exemple, si vous écrivez une méthode qui calcule la racine carrée d'un numéro, elle ne fonctionnera que pour les nombres plus grands que ou égal à zéro, et le résultat est garanti de satisfaire les mêmes conditions: P>

public double sqrt(final double x) {
    assert x >= 0 : "Cannot calculate the square root of a negative number!"
    double result = ...;
    assert result >= 0 : "Something went wrong when calculating the square root!"
    return result;
}


9 commentaires

Donc, si je ne demandais pas au compilateur de les supprimer du dernier bytecode, et quelque chose ne va pas et comme vous avez dit que l'expression booléenne évalue à FALSE, il lancera une exception au moment de l'exécution, non?


En fait, il lancera un AssertionError , qui est une sous-classe d'erreur, qui est une sous-classe de lancée . Exception est une autre sous-classe de lancée , mais avec différentes sémantiques. Vous pouvez penser à erreur comme quelque chose beaucoup moins pire d'une exception . Les exceptions sont là afin que vous puissiez séparer votre «code principal» du code qui traite de problèmes pouvant survenir à l'exécution (IoException, par exemple). Les erreurs sont jetées lorsque quelque chose de bien pire, et généralement irrécupérable, se produit, tel que OutofMemoryError, ou StackoverFlowerror.


Votre objectif est de rendre votre code de telle sorte qu'il jamais jette un assertionError , car cela signifierait que votre code n'est pas utilisé correctement (c.-à-d. Les conditions préalables qui doivent être Satisfait pour qu'il fonctionne correctement ne soit pas assez satisfait!).


Donc, c'est comme une condition IF et, il lancera la nouvelle exception d'AssertionError (message), si la condition est satisfaite, mais avec l'avantage de -il-peut-être retiré-de-le-bytecode-.


Si vous souhaitez essayer Programme par contrat en Java, un point de départ pourrait être la bibliothèque de Guava de Google. Il contient une classe appelée conditions préalables , qui comporte des méthodes statiques qui prennent des expressions et des chaînes et fonctionnent presque comme le mot clé . Les principales différences sont les suivantes: (1) Guava lancera des exceptions non vérifiées plutôt que d'AssertionError; (2) Les méthodes ont plus de noms sémantiques, tels que des préconditions.Checknotnull (myParamètre); (3) Ils ne peuvent pas être automatiquement supprimés par le compilateur.


À propos de votre dernier commentaire: Oui, exactement!


Ainsi, lorsque vous avez dit "L'aspect le plus intéressant des affirmations est que vous pouvez demander au compilateur de les supprimer du bytecode, de sorte que vous n'obtenez aucune pénalité de performance au moment de la production." Comment demander au compilateur de supprimer les codes asserts? Est-ce quelques astuces ou juste passer des arguments et fait


Vous venez de passer un argument au compilateur: Javac -DisableAsertion MyClass.Java . L'argument lui-même prend des arguments, afin que vous puissiez désactiver de manière sélective les assertions sur certaines classes et les conserver sur les autres.


Vous pouvez également activer ou désactiver les affirmations au moment de l'exécution (lorsqu'elles ne sont pas supprimées par le compilateur), consultez l'argument de ligne -a .



3
votes

the affirmer le mot-clé a été introduit dans 1.4 (Suivez ce lien pour une description complète). C'est un raccourci de jeter une exception au moment de l'exécution si une condition n'est pas satisfaite.

pense à cela comme xxx

comme xxx

L'idée est de donner aux développeurs un moyen simple d'aider les utilisateurs (dans votre cas GWT API utilisateurs) pour détecter des erreurs communes / des pièges

quand il a été introduit, le affirme La déclaration est devenue un mot réservé et qui a provoqué quelques problèmes de compilation lorsque l'ancien code a été recompilé pour I.4. Surtout pour les suites de test JUnit où il y avait une méthode assert () AssertTtrue ()


0 commentaires

0
votes

L'ASSERT est utilisé pour simplifier l'exception UserDefinefinine.Quelle se passe-t-il, pour définir une exception UseDefinefinie, nous devons créer notre propre classe d'exception en définissant l'exception à l'origine de l'état, puis nous devons lancer cela dans notre programme. Mais à partir de Java 1.5, nous avons un mot-clé comme assert où seulement nous devons écrire asserts (condition) si la confrontation est vraie, il exécute l'autre partie du programme ou si elle est fausse, elle crée l'objet de la classe AssertionError et nous avons pour le gérer. Donc, pas besoin de définir notre erreur UserDefind.


0 commentaires

0
votes

Le texte suivant (emphase mine) explique clairement diverses formes d'affirmations:

L'instruction Assertion a deux formes.

la première forme plus simple est:

affirmation expression1;

Où expression1 est une expression booléenne. Lorsque Le système exécute l'affirmation, il évalue l'expression1 et s'il est Faux lancers une AssertionError sans message de détail.

la deuxième forme de l'énoncé d'affirmation est:

affirmation expression1: expression2; (Votre exemple tombe ici)

Où: expression1 est une expression booléenne. Expression2 est une expression qui a une valeur. (Cela ne peut pas être une invocation d'une méthode déclarée annuler.) Utilisez cette version de la déclaration d'Aster pour fournir un détail Message pour l'AssertionError. Le système transmet la valeur de Expression2 au constructeur AssertionError approprié, qui utilise la représentation des chaînes de la valeur comme le message de détail de l'erreur.

En outre, reportez-vous au lien Oracle suivant pour des informations détaillées: http://docs.oracle.com/javase/ 7 / DOCS / TECHNOTES / GUIDES / LANGUE / ASSERT.HTML


0 commentaires