Consejo rápido Cómo depurar un error AS3 # 1120

Un error de ActionScript muy común es el Error 1120, el error de "propiedad indefinida". De hecho, este puede ser el error de compilación más común. Su causa es muy simple, pero hay varias formas de inducirla. Haremos un recorrido rápido por algunos de los escenarios en los que se encontrará con este error y cómo solucionarlos..


La explicación

Primero, vamos a tener una idea general de lo que está pasando con este error. Esta será nuestra discusión teórica; Llegaremos a ejemplos más prácticos en el resto de la punta..

Usted encuentra este error cuando hace referencia a una variable (o propiedad) en una línea de código, pero esa variable no existe. Si estás acostumbrado a escribir ActionScript en el panel Script, y no en clases, entonces no te desanimes con el término "propiedad". No voy a entrar en una discusión prolongada sobre por qué tenemos estos dos términos, pero basta con decir que dada la forma en que ActionScript compila el código desde el panel Script, una variable es en realidad una propiedad..

Si el compilador de ActionScript no puede encontrar la propiedad que ha especificado, lo marca con el error de compilador 1120. Verá algo como esto:

 1120: Acceso de propiedad indefinida foo.

Dónde "foo"es el nombre de su propiedad ofensiva.

Solucionar esto generalmente tan fácil como obtener el nombre correcto. Vamos a ver.


Ejemplo 1: No hay declaración de variable

Tome este código por ejemplo (si lo desea, puede abrir el "desaparecido"proyecto de ejemplo (es decir, el proyecto denominado" falta "en la descarga de origen) o cree este proyecto por su cuenta: simplemente cree un nuevo archivo Flash y una clase de documento para él, y coloque este código en la clase de documento):

 paquete import flash.display. *; public class Missing extiende Sprite public function Missing () foo = "Moo."; 

Compila este FLA, y obtendrás el 1120: Acceso de propiedad indefinida foo. error, dirigido a linea 7.

Una vez más, la causa es probablemente muy clara; nunca has declarado el foo propiedad y así usarlo en la línea 7 como si ya existiera causa problemas. La solución es simplemente declarar la variable. Técnicamente, esto puede existir en cualquier lugar en el ámbito apropiado. Cada una de las siguientes son soluciones aceptables:

Declararlo como un parámetro del método:

 Función pública Missing (foo: String) foo = "Moo."; 

Declararlo como una variable local dentro del método:

 función pública Missing () var foo: String; foo = "Moo."; 

Declararlo como una propiedad de instancia en la clase:

 paquete import flash.display. *; La clase pública Missing extiende Sprite private var foo: String; función pública Missing () foo = "Moo."; 

La solución depende de lo que sea apropiado para lo que estás tratando de hacer. No es común declarar un parámetro de método y luego simplemente establecerlo en el cuerpo del método, aunque hay casos en los que desea afectar los valores de los parámetros.

Lo que puede ser interesante es la forma en que Flash buscará una variable del nombre. Primero, busca una variable local del nombre. foo. Si uno no fue declarado, entonces mira los parámetros para ese nombre. Si no puede encontrar uno allí, busca una propiedad de instancia del mismo nombre. Si no se encuentra ninguno de estos, verá el error 1120.


Ejemplo 2: Un error tipográfico

Nuestro siguiente ejemplo será bastante similar. Una vez más, simplemente puede abrir el "error de tipografía"proyecte desde la descarga; o cree una FLA simple con clase de documento y pegue / escriba el siguiente código en la clase; o simplemente lea.

 paquete import flash.display. *; la clase pública Typo extiende Sprite var foo: String; Función pública Typo () boo = "Moo."; 

No hay mucho que hacer aquí. La idea es declarar una propiedad llamada. foo, y luego en el constructor establece que el valor "Mugir.". La carne de esto está en las líneas 5 y 9, resaltadas arriba. El resto es solo clase de documento..

Una vez más, el error es probablemente dolorosamente obvio. Y, por supuesto, lo es, cuando solo hay dos líneas de código para preocuparse. Claramente tenemos un error tipográfico; queríamos escribir:

 foo = "Moo.";

Y si soluciona el error tipográfico, podrá compilar el FLA sin el error 1120.

Si bien este es obvio, quiero hacer dos notas. La primera es que los errores tipográficos como este son en realidad algo comunes y más difíciles de deducir cuando tienes miles de líneas de código en tu proyecto. Un buen IDE o editor de texto puede ayudarlo completando automáticamente u otros tipos de verificación de errores, pero como ActionScript a prueba de fallas también lo ayudará a producir el Error 1120.

La segunda nota es que el error que ActionScript está informando en realidad es que está intentando hacer referencia a una propiedad llamada "abucheo", pero no está encontrando uno. En este ejemplo, hemos producido el error al introducir un error tipográfico en nuestro código. Pero ActionScript no sabe que realmente quería decir"foo"; asume que cuando escribes"boo = "Moo.";"que quisiste decir abucheo, y le avisa cuando no puede encontrar una propiedad con ese nombre.

Esta es una distinción bastante sutil, pero es útil tener en cuenta la verdadera causa del error..


Ejemplo 3: Declarar instancias de escenario

Nuestro ejemplo final incluye el IDE de Flash en particular, y puede ignorarse de forma segura si no está utilizando Flash CS3 / 4/5, y en su lugar utiliza Flash Builder con el Marco de trabajo flexible. Configurar el error tomará unos simples pasos.

Puedes encontrar el proyecto problemático en el escenario-instancia Carpeta del paquete de descarga. O puedes volver a crearlo siguiendo estos pasos:

  1. Comience con un nuevo archivo Flash y una clase de documento asociada.
  2. En el archivo Flash, dibuje una forma de algún tipo y conviértala en un símbolo.
  3. Seleccione la instancia de símbolo en el escenario y abra el panel Propiedades, y nombre la instancia instance_mc.
  4. Todavía en Flash, elija Archivo> Configuración de publicación luego selecciona el Destello lengüeta.
  5. Haga clic en el Configuraciones… Botón junto al menú emergente "Script:".
  6. Donde se dice Etapa: Declarar automáticamente las instancias de la etapa., asegúrese de que la casilla de verificación es Naciones Unidasseleccionado.
  7. Agregue el siguiente código a la clase de documento:

     paquete import flash.display. *; La clase pública StageInstance extiende Sprite public function StageInstance () instance_mc.rotation = 45; 

En este punto, sigue adelante y ejecuta la película. Una vez más obtendrá el error 1120.

Como puede suponer, la desactivación de "Declarar automáticamente instancias de la etapa" tuvo mucho que ver con la generación del error. Es una opción que está activada de manera predeterminada, por lo que probablemente tenga una razón para - y tenga en cuenta - apagarla.

Lo que se hace es bastante autoexplicativo, pero agregaré mis dos centavos. Cuando tiene una clase de documento (o una clase personalizada vinculada a un símbolo en la biblioteca), esa clase se extiende Duende o Clip de película. Las reglas típicas para crear variables y propiedades se aplican al igual que cualquier otra clase, pero como tiene una interfaz visual para este objeto, el IDE de Flash, puede estar agregando propiedades de manera implícita al dibujar más símbolos en el escenario y darles nombres de instancia..

Si "Declarar automáticamente instancias del escenario" está activada, Flash pasará por los objetos agregados al escenario a través del IDE e insertará declaraciones de propiedad en las clases apropiadas para cada instancia de símbolo con un nombre.

Si está apagado, entonces Flash no hará nada con las instancias en el escenario..

Para evitar el error, simplemente puede volver a activar esta opción. Alternativamente, puede declarar manualmente las instancias de la etapa. Si hacemos que nuestra clase de documentos se vea así:

 paquete import flash.display. *; la clase pública StageInstance extiende Sprite public var instance_mc: MovieClip; función pública StageInstance () instance_mc.rotation = 45; 

Esto también evitaría el error, porque la propiedad todavía está declarada; simplemente no ha sido declarado automáticamente por Flash Professional.

Tenga en cuenta que si el modificador de acceso no es público obtendrá un error de tiempo de ejecución. No voy a entrar en detalles sobre este error; Eso será para otro consejo rápido..

Ahora, ¿por qué querrías desactivar esa opción en primer lugar? Creo que las razones tienen que ver con ir más allá de Flash como herramienta de desarrollo. Si usa Flash Builder para codificar, ASDoc, o integra contenido de Flash dentro de un proyecto de Flex, es posible que aprecie las ramificaciones de desactivar la opción. Si lo desactivas, estás obligado a declarar las propiedades manualmente. Lo contrario también es cierto: si lo enciendes, te verás obligado a no declarar manualmente esas propiedades.

Por lo tanto, si ejecuta sus archivos de clase a través de ASDoc, lo más probable es que encuentre una referencia a una instancia de escenario, pero no a su declaración, y recibirá el error 1120. Activar la opción es una comodidad, pero desactivarlo lo obliga escribir código más "puro" que sea más portátil y autónomo.


Declaro este consejo rápido hecho

Como muchos errores, el Error 1120 es simple de corazón y fácil de solucionar una vez que sepa qué buscar. Gracias por leer, y estad atentos para más consejos de depuración.!