Astuce Comment déboguer une erreur AS3 # 1203

Dans ce petit conseil, nous aborderons l’erreur 1203 «Aucun constructeur trouvé», source de confusion, qui apparaît sans provocation et qui est malheureusement libellée. Nous allons examiner le scénario dans lequel il apparaîtra et comment le résoudre..


Étape 1: Description obligatoire, mais plutôt inutile, de l'erreur 1203

Tout d'abord, voici le langage de l'erreur:

 1203: Aucun constructeur par défaut trouvé dans la classe de base flash.display: BitmapData.

Il est difficile de décomposer cela en anglais simple. Passons maintenant à un scénario qui produit cette erreur.


Étape 2: Un projet déréglé

Vous pouvez trouver ce projet dans le package de téléchargement, dans le dossier "éclaté". Il comprend les éléments suivants (que vous pouvez utiliser pour recréer ce projet si vous préférez une approche pratique):

  1. Un FLA nommé Busted.fla. Il est vide, mais est lié à la classe de document décrite ci-après..
  2. Une classe de document nommée Busted.as. Cela s'étend Lutin et crée simplement une instance de la classe décrite ci-après, et l'ajoute à la scène.
    Le contenu de la classe est le suivant:

     package import flash.display. *; classe publique Busted extend Sprite fonction publique Busted () var bmp: Bitmap = new Bitmap (new BustedBitmap ()); addChild (bmp); 

    le BustedBitmap la classe s'étend BitmapData, et nous l'utilisons pour nourrir un Bitmap objet, qui est ensuite ajouté à la scène.

  3. Un autre fichier de classe nommé BustedBitmap.as. Comme mentionné précédemment, cela s'étend BitmapData, et son but est d'être un BitmapData qui s’alimente automatiquement avec du bruit Perlin. Son contenu est:

     package import flash.display. *; classe publique BustedBitmap etend BitmapData fonction publique BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

    Donc, dans le BustedBitmap constructeur, nous appelons perlinNoise () et donc nous avons automatiquement quelque chose d'intéressant dans les données de pixels, de sorte que nous pouvons voir quelque chose tout de suite lors de l'affichage sur la scène.

Maintenant, allez-y et testez le film. Vous obtiendrez l’erreur 1203, indiquée à la ligne 4 de BustedBitmap.as. Et la ligne 4 est…

 fonction publique BustedBitmap () 

Étape 3: Qu'est-ce que tout cela, alors?

Alors, qu'est-ce-qu'il s'est passé? Il est important de garder à l’esprit que nous écrivons une classe qui est une sous-classe d’une autre classe (BitmapData dans ce cas). Gardez également à l’esprit que lorsqu’une classe est instanciée, le constructeur est appelé dans le cadre du "Nouveau"processus.

Si vous n'écrivez pas réellement un constructeur, ActionScript en impliquera un pour vous. Il ressemblera à ceci:

 fonction publique [NameOfClass] () 

Où "[NameOfClass]"correspondra au nom de votre classe.

De même, si vous écrivez une sous-classe et que vous n'appelez pas super() ActionScript implique également cet appel pour vous. Il ressemblera à ceci:

 fonction publique [NameOfSubclass] () super (); // Autre code explicite dans le constructeur de la sous-classe

Notez que cela se produit sur la première ligne et qu’il s’agit simplement d’un appel à super sans argument.

Enfin, nous arrivons à la racine du problème. Si votre sous-classe omet un appel explicite à super, et le constructeur de votre super-classe a des paramètres requis, alors votre appel implicite à super ne fournit pas les paramètres requis. Vous penseriez peut-être qu'une erreur de non-concordance des arguments pourrait intercepter ce problème, mais considérez que, dans la mesure où aucun code n'est réellement écrit pour remédier à cette incompatibilité, ActionScript ne peut que se plaindre du manque de constructeur.

Dans notre exemple, BustedBitmap étendre BitmapData, qui a un constructeur défini dans la documentation comme suit:

 BitmapData (largeur: int, hauteur: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)

Les deux premiers paramètres sont obligatoires et nous ne les fournissons pas..


Étape 4: C'est aussi simple que…

La solution est, une fois que vous comprenez le problème, extrêmement simple. Vous devez appeler explicitement le super constructeur, du moins s'il existe des paramètres obligatoires. En d'autres termes, dans notre BustedBitmap classe, la ligne en surbrillance suivante résoudra le problème:

 package import flash.display. *; classe publique BustedBitmap étend BitmapData fonction publique BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, faux, faux, 7, vrai); 

Et ça le fera.

En tant que moment propice à l'apprentissage, j'aimerais ajouter que, lors de l'extension d'une autre classe, c'est généralement une bonne idée d'inclure l'appel explicite à super. Même s’il n’existe aucun paramètre, obligatoire ou non (comme dans Lutin ou MovieClip), un appel explicite peut déclarer l’intention et la conscience de la nature de la sous-classe. Plus concrètement, les appels explicites vous permettent d’exécuter du code avant l’appel à super, ce qui peut être utile dans certaines situations.


Étape 5:… et c'est tout

Encore une autre erreur démystifiée; le défi pour celui-ci est que la cause réelle de l'erreur est assez enterrée. Une fois que vous devenez pratique avec une pelle, cependant, la solution est assez facile.

Merci d'avoir lu et soyez prêt pour plus de conseils de débogage.