Astuce Comment déboguer une erreur AS3 # 1120

L'erreur 1120, l'erreur de "propriété non définie", est une erreur ActionScript très courante. En fait, il s’agit peut-être de l’erreur de compilation la plus courante. Sa cause est très simple, mais il peut être induit de différentes manières. Nous allons faire un tour rapide de quelques-uns des scénarios dans lesquels vous rencontrerez cette erreur et comment les résoudre..


L'explication

Tout d’abord, voyons l’idée générale de ce qui se passe avec cette erreur. Ce sera notre discussion théorique; nous allons arriver à des exemples plus pratiques dans le reste de la pointe.

Vous constatez que cette erreur se produit lorsque vous référencez une variable (ou propriété) dans une ligne de code, mais que cette variable n'existe pas. Si vous avez l'habitude d'écrire ActionScript dans le panneau Script, et non dans les classes, ne vous laissez pas rebuter par le terme "propriété". Je ne vais pas me lancer dans une longue discussion sur les raisons pour lesquelles nous avons ces deux termes, mais il suffit de dire que, vu la façon dont ActionScript compile le code à partir du panneau Script, une variable est en réalité une propriété..

Si le compilateur ActionScript ne peut pas trouver la propriété que vous avez spécifiée, il la marque avec l'erreur de compilateur 1120. Vous verrez quelque chose comme ceci:

 1120: Accès à la propriété non définie foo.

Où "foo"est le nom de votre propriété incriminée.

Résoudre ce problème est aussi simple que d’obtenir le nom exact. Nous allons jeter un coup d'oeil.


Exemple 1: pas de déclaration de variable

Prenez ce code par exemple (si vous voulez, vous pouvez ouvrir le "manquant"exemple de projet (c'est-à-dire le projet nommé" manquant "dans le téléchargement source) ou créez ce projet par vous-même: créez simplement un nouveau fichier Flash et une classe de document pour celui-ci, et placez ce code dans la classe de document):

 package import flash.display. *; public class Missing étend Sprite public function Missing () foo = "Moo."; 

Compilez cette FLA et vous obtiendrez le 1120: Accès à la propriété non définie foo. erreur, dirigé à la ligne 7.

Encore une fois, la cause est probablement très claire. tu n'as jamais déclaré le foo ainsi, l’utiliser à la ligne 7 comme s’il existait déjà pose des problèmes. La solution consiste simplement à déclarer la variable. Techniquement, cela peut exister n'importe où dans l'étendue appropriée. Chacune des solutions suivantes est acceptable:

Déclarez-le en tant que paramètre de la méthode:

 fonction publique Missing (foo: String) foo = "Moo."; 

Déclarez-le comme une variable locale dans la méthode:

 fonction publique Missing () var foo: String; foo = "Moo."; 

Déclarez-le comme une propriété d'instance dans la classe:

 package import flash.display. *; Classe publique manquante étend Sprite private var foo: String; fonction publique Missing () foo = "Moo."; 

La solution dépend de ce qui convient à ce que vous essayez de faire. Il n'est pas courant de déclarer un paramètre de méthode et de le définir simplement dans le corps de la méthode, bien que dans certains cas, vous souhaitiez affecter les valeurs du paramètre..

Ce qui peut être intéressant est la manière dont Flash recherchera une variable du nom. Tout d'abord, il cherche une variable locale du nom foo. Si l'un n'a pas été déclaré, il examine les paramètres de ce nom. S'il ne parvient pas à en trouver une, il recherche une propriété d'instance du même nom. Si aucun de ceux-ci sont trouvés, vous verrez l'erreur 1120.


Exemple 2: une faute de frappe

Notre prochain exemple sera assez similaire. Encore une fois, vous pouvez simplement ouvrir le "faute de frappe"projet depuis le téléchargement; ou créez un fichier FLA simple avec une classe de document et collez / tapez le code suivant dans la classe; ou venez simplement de le lire.

 package import flash.display. *; Classe publique Typo: Sprite var foo: String; fonction publique Typo () boo = "Moo."; 

Il n'y a pas grand chose à faire ici. L'idée est de déclarer une propriété appelée foo, puis dans le constructeur mis cela à la valeur "Meuglement.". La viande de ceci est sur les lignes 5 et 9, soulignées ci-dessus. Le reste n'est qu'un document passe-partout.

Encore une fois, l'erreur est probablement douloureusement évidente. Et bien sûr, quand il n'y a que deux lignes de code pour vous préoccuper. Nous avons clairement une faute de frappe; nous voulions écrire:

 foo = "Moo.";

Et si vous corrigez la faute de frappe, vous serez en mesure de compiler le fichier FLA sans l'erreur 1120.

Bien que celle-ci soit évidente, je veux prendre deux notes. La première est que des fautes de frappe comme celle-ci sont en fait assez communes et plus difficiles à déduire lorsque vous avez des milliers de lignes de code dans votre projet. Un bon éditeur de texte ou un éditeur de texte peut vous aider en fournissant l'auto-complétion ou un autre type de vérification d'erreur, mais en tant que sécurité intégrée, ActionScript vous aidera également en générant l'erreur 1120..

La deuxième remarque est que l'erreur signalée par ActionScript est que vous essayez de référencer une propriété appelée "huer", mais il n'en trouve pas. Dans cet exemple, nous avons généré l'erreur en introduisant une faute de frappe dans notre code. Mais ActionScript ne sait pas que vous avez vraiment voulu dire"foo"; il suppose que lorsque vous écrivez"boo = "Moo.";"que tu voulais dire huer, et vous avertit quand il ne peut pas trouver une propriété de ce nom.

C'est une distinction assez subtile, mais il est utile de garder à l'esprit la vraie cause de l'erreur.


Exemple 3: déclaration d'instances d'étape

Notre dernier exemple concerne en particulier Flash IDE et peut être ignoré en toute sécurité si vous n'utilisez pas Flash CS3 / 4/5, mais plutôt Flash Builder avec Flex Framework. La configuration de l’erreur se fera en quelques étapes simples.

Vous pouvez trouver le projet problématique dans la exemple de scène dossier du package de téléchargement. Ou vous pouvez le recréer en procédant comme suit:

  1. Commencez avec un nouveau fichier Flash et la classe de document associée.
  2. Dans le fichier Flash, dessinez une forme quelconque et transformez-la en symbole.
  3. Sélectionnez l'instance de symbole sur la scène, ouvrez le panneau Propriétés et nommez l'instance. instance_mc.
  4. Toujours en Flash, choisissez Fichier> Paramètres de publication puis sélectionnez le Flash languette.
  5. Clique sur le Réglages… bouton en regard du menu contextuel "Script:".
  6. Où est dit Stage: Déclarer automatiquement les instances d'étape, assurez-vous que la case à cocher est ONUchoisi.
  7. Ajoutez le code suivant à la classe de document:

     package import flash.display. *; Classe publique StageInstance étend Sprite fonction publique StageInstance () instance_mc.rotation = 45; 

À ce stade, lancez le film. Vous aurez encore une fois l'erreur 1120.

Comme vous pouvez le supposer, désactiver "Déclarer automatiquement les instances d'étape" a beaucoup à voir avec la génération de l'erreur. C'est une option qui est activée par défaut, donc vous auriez probablement une raison pour - et soyez conscient - de l'éteindre.

Que fait-on si on s’explique assez bien, mais je vais ajouter mes deux sous. Lorsque vous avez une classe de document (ou une classe personnalisée liée à un symbole de la bibliothèque), cette classe s’étend Lutin ou MovieClip. Les règles habituelles pour la création de variables et de propriétés s'appliquent comme toute autre classe, mais comme vous avez une interface visuelle pour cet objet, l'IDE Flash, vous pouvez ajouter implicitement des propriétés en traçant plus de symboles sur la scène et en leur attribuant des noms d'instance..

Si "Déclarer automatiquement les instances d'étape" est activé, Flash passe en revue les objets ajoutés à l'étape via l'EDI et insère les déclarations de propriété dans les classes appropriées pour chaque instance de symbole avec un nom..

Si ce n'est pas le cas, Flash ne fera rien avec les instances de la scène..

Pour éviter cette erreur, vous pouvez simplement réactiver cette option. Vous pouvez également déclarer manuellement les instances d'étape. Si nous avons fait ressembler notre classe de document à ceci:

 package import flash.display. *; Classe publique StageInstance étend Sprite public var instance_mc: MovieClip; fonction publique StageInstance () instance_mc.rotation = 45; 

Cela éviterait également l'erreur, car la propriété est toujours déclarée; il n'a tout simplement pas été déclaré automatiquement par Flash Professional.

Notez que si le modificateur d'accès n'est pas Publique vous obtiendrez une erreur d'exécution. Je ne vais pas entrer dans les détails de cette erreur; ce sera pour un autre conseil rapide.

Maintenant, pourquoi voudriez-vous un jour désactiver cette option? Je pense que les raisons ont toutes à voir avec le fait d'aller au-delà de Flash en tant qu'outil de développement. Si vous utilisez Flash Builder pour coder, ASDoc ou intégrer le contenu Flash dans un projet Flex, vous apprécierez peut-être les conséquences de la désactivation de l'option. Si vous le désactivez, vous devez alors déclarer les propriétés manuellement. L’inverse est également vrai: si vous l’allumez, vous êtes obligé de ne pas déclarer manuellement ces propriétés.

Ainsi, si vous exécutez vos fichiers de classe via ASDoc, il trouvera très probablement une référence à une instance d'étape, mais pas sa déclaration, et vous recevrez l'erreur 1120. L'activation de l'option est pratique, mais le désactiver vous oblige à écrire plus de code "pur", plus portable et autonome.


Je déclare ce conseil rapide fait

Comme beaucoup d'erreurs, l'erreur 1120 est simple au cœur et facile à corriger une fois que vous savez quoi rechercher. Merci de lire et de rester à l'écoute pour plus de débogage Conseils rapides!