Suggerimento rapido come eseguire il debug di un errore AS3 # 1120

Un errore ActionScript molto comune è l'errore 1120, l'errore "proprietà non definita". In effetti, questo potrebbe essere l'errore di compilazione più comune. La sua causa è molto semplice, ma ci sono diversi modi in cui può effettivamente essere indotta. Faremo un breve tour di alcuni degli scenari in cui si verificherà questo errore e come risolverli.


La spiegazione

Per prima cosa, prendiamo l'idea generale di cosa sta succedendo con questo errore. Questa sarà la nostra discussione teorica; arriveremo ad altri esempi pratici nella parte restante del suggerimento.

Questo errore si verifica quando si fa riferimento a una variabile (o una proprietà) in una riga di codice, ma tale variabile non esiste. Se sei abituato a scrivere ActionScript nel pannello Script e non nelle classi, non esagerare con il termine "proprietà". Non farò una lunga discussione sul perché abbiamo questi due termini, ma basti dire che dato il modo in cui ActionScript compila il codice dal pannello Script, una variabile è in realtà una proprietà.

Se il compilatore di ActionScript non riesce a trovare la proprietà che hai specificato, lo contrassegna con l'errore 1120 del compilatore. Vedrai qualcosa di simile a questo:

 1120: accesso alla proprietà non definita foo.

Dove "foo"è il nome del nome della proprietà offendente.

Risolvere questo di solito è facile come ottenere il nome giusto. Diamo un'occhiata.


Esempio 1: nessuna dichiarazione di variabile

Prendi questo codice per esempio (se vuoi, puoi aprire il "mancante"esempio di progetto (ovvero il progetto chiamato" mancante "nel download sorgente) o crea questo progetto da solo: basta creare un nuovo file Flash e una classe di documento per esso, e inserire questo codice nella classe del documento):

 pacchetto import flash.display. *; public class Missing extends Sprite funzione pubblica Missing () foo = "Moo."; 

Compila questo FLA e otterrai il 1120: accesso alla proprietà non definita foo. errore, diretto alla linea 7.

Ancora una volta, la causa è probabilmente molto chiara; non hai mai dichiarato il foo proprietà e quindi utilizzarlo nella riga 7 come se esistesse già causa problemi. La soluzione è semplicemente dichiarare la variabile. Tecnicamente, questo può esistere ovunque nell'ambito appropriato. Ciascuno dei seguenti sono soluzioni accettabili:

Dichiararlo come parametro per il metodo:

 funzione pubblica Missing (foo: String) foo = "Moo."; 

Dichiaralo come variabile locale all'interno del metodo:

 funzione pubblica Missing () var foo: String; foo = "Moo."; 

Dichiaralo come una proprietà di istanza nella classe:

 pacchetto import flash.display. *; public class Missing extends Sprite private var foo: String; funzione pubblica Missing () foo = "Moo."; 

La soluzione dipende da cosa è appropriato a ciò che stai cercando di fare. Non è normale dichiarare un parametro di metodo e quindi semplicemente impostarlo nel corpo del metodo, anche se ci sono casi in cui si desidera influenzare i valori dei parametri.

Ciò che può essere interessante è il modo in cui Flash cercherà una variabile del nome. Innanzitutto, cerca una variabile locale del nome foo. Se uno non è stato dichiarato, guarda i parametri per quel nome. Se non riesce a trovarne uno, cerca una proprietà di istanza con lo stesso nome. Se nessuno di questi viene trovato, visualizzerai l'errore 1120.


Esempio 2: un errore di battitura

Il nostro prossimo esempio sarà piuttosto simile. Di nuovo, puoi semplicemente aprire il "errore di battitura"progetta dal download o crea un semplice FLA con classe di documento e incolla / digita il codice seguente nella classe o leggi semplicemente lungo.

 pacchetto import flash.display. *; public class Typo extends Sprite var foo: String; funzione pubblica Typo () boo = "Moo."; 

Non c'è molto da fare qui. L'idea è dichiarare una proprietà chiamata foo, e poi nel costruttore impostalo sul valore "Muggire.". La carne di questo è sulle linee 5 e 9, evidenziate sopra. Il resto è solo un documento di classe ufficiale.

Di nuovo, l'errore è probabilmente dolorosamente ovvio. E ovviamente lo è, quando ci sono solo due righe di codice con cui preoccuparti. Chiaramente abbiamo un refuso; intendevamo scrivere:

 foo = "Moo.";

E se correggi l'errore, sarai in grado di compilare il FLA senza l'errore 1120.

Mentre questo è ovvio, voglio fare due note. La prima è che errori di battitura come questo sono in realtà un po 'comuni e più difficili da dedurre quando si hanno migliaia di linee di codice nel progetto. Un buon IDE o editor di testo può aiutarti fornendo completamento automatico o altri tipi di controllo degli errori, ma come un ActionScript sicuro ti aiuterà anche a produrre l'errore 1120.

La seconda nota è che l'errore segnalato da ActionScript è che si sta tentando di fare riferimento a una proprietà denominata "fischio", ma non lo trova. In questo esempio, abbiamo generato l'errore introducendo un errore di battitura nel nostro codice, ma ActionScript non sa che intendevi davvero"foo"; presume che quando scrivi"boo = "Moo.";"che intendevi fischio, e ti avvisa quando non riesce a trovare una proprietà con quel nome.

Questa è una distinzione piuttosto sottile, ma è utile tenere a mente la vera causa dell'errore.


Esempio 3: dichiarazione delle istanze della fase

Il nostro esempio finale riguarda in particolare l'IDE Flash e può essere tranquillamente ignorato se non si utilizza Flash CS3 / 4/5 e si utilizza Flash Builder con Flex Framework. La configurazione dell'errore richiederà alcuni semplici passaggi.

È possibile trovare il progetto problematico nel stage-istanza cartella del pacchetto di download. O puoi ricrearlo seguendo questi passaggi:

  1. Inizia con un nuovo file Flash e una classe di documenti associata.
  2. Nel file Flash, disegna una forma di qualche tipo e trasformala in un simbolo.
  3. Selezionare l'istanza del simbolo sullo stage e aprire il pannello Proprietà e denominare l'istanza instance_mc.
  4. Sempre in Flash, scegli File> Impostazioni pubblicazione quindi selezionare il Veloce linguetta.
  5. Clicca sul Impostazioni… pulsante accanto al menu a comparsa "Script:".
  6. Dove si dice Stage: dichiara automaticamente le istanze di stage, assicurati che la casella di controllo sia unselezionato.
  7. Aggiungi il seguente codice alla classe del documento:

     pacchetto import flash.display. *; public class StageInstance estende Sprite public function StageInstance () instance_mc.rotation = 45; 

A questo punto, vai avanti e avvia il film. Riceverai nuovamente l'errore 1120.

Come potreste essere in grado di supporre, disattivando "Dichiarate automaticamente le istanze di stage" era necessario fare molto con la generazione dell'errore. Si tratta di un'opzione che è attivata per impostazione predefinita, quindi probabilmente avresti una ragione - ed essere a conoscenza - spegnendolo.

Che cosa fa se abbastanza auto-esplicativo, ma aggiungerò i miei due centesimi. Quando hai una classe di documenti (o una classe personalizzata collegata a un simbolo nella libreria), quella classe si estende folletto o Un filmato. Le regole tipiche per la creazione di variabili e proprietà si applicano come qualsiasi altra classe, ma poiché hai un'interfaccia visuale per questo oggetto - l'IDE Flash - potresti aggiungere implicitamente delle proprietà disegnando più simboli sullo stage e assegnandogli nomi di istanze.

Se "Istanze di stage dichiarate automaticamente" è attivo, Flash passerà attraverso gli oggetti aggiunti allo stage tramite l'IDE e inserirà le dichiarazioni di proprietà nelle classi appropriate per ogni istanza di simbolo con un nome.

Se è spento, Flash non farà nulla con le istanze sul palco.

Per evitare l'errore, puoi semplicemente riattivare questa opzione. In alternativa, puoi dichiarare manualmente le istanze di stage. Se abbiamo reso la nostra classe di documento simile a questa:

 pacchetto import flash.display. *; public class StageInstance estende Sprite public var instance_mc: MovieClip; funzione pubblica StageInstance () instance_mc.rotation = 45; 

Questo eviterebbe anche l'errore, perché la proprietà è ancora dichiarata; semplicemente non è stato dichiarato automaticamente da Flash Professional.

Notare che se il modificatore di accesso non lo è pubblico otterrai un errore di runtime. Non ho intenzione di entrare nei dettagli su questo errore; questo sarà per un altro suggerimento rapido.

Ora, perché dovresti mai voler disattivare quell'opzione in primo luogo? Penso che le ragioni abbiano tutte a che fare con lo spostamento oltre Flash come strumento di sviluppo. Se utilizzi Flash Builder per codificare, o ASDoc, o per integrare contenuti Flash all'interno di un progetto Flex, potresti apprezzare le conseguenze della disattivazione dell'opzione. Se lo spegni, sei obbligato a dichiarare le proprietà manualmente. È vero anche il contrario: se lo accendi, sei costretto a farlo non dichiarare manualmente tali proprietà.

Quindi, se esegui i tuoi file di classe tramite ASDoc, molto probabilmente troverai un riferimento a un'istanza di stage, ma non la sua dichiarazione, e riceverai l'errore 1120. Attivare l'opzione è una comodità, ma disattivarla ti costringe scrivere più codice "puro" che è più portatile e autonomo.


Dichiaro questo suggerimento rapido fatto

Come molti errori, l'errore 1120 è semplice e facile da risolvere una volta che sai cosa cercare. Grazie per la lettura e restate sintonizzati per ulteriori suggerimenti rapidi per il debug!