Sfat rapid Cum se depanează o eroare AS3 # 1120

O eroare foarte răspândită în ActionScript este eroarea 1120, eroarea "nedefinită". De fapt, aceasta poate fi cea mai obișnuită eroare de compilare-timp. Cauza sa este foarte simplă, dar există o serie de moduri în care poate fi indusă. Vom face un scurt tur de câteva scenarii în care veți întâlni această eroare și cum să le remediați.


Explicatia

Mai întâi, să înțelegem ce se întâmplă cu această eroare. Aceasta va fi discuția noastră teoretică; vom ajunge la mai multe exemple practice în restul sfatului.

Această eroare apare atunci când menționați o variabilă (sau o proprietate) într-o linie de cod, dar această variabilă nu există. Dacă sunteți obișnuit să scrieți ActionScript în panoul Script, și nu în clase, atunci nu vă opriți de termenul "proprietate". Nu voi intra într-o discuție lungă cu privire la motivul pentru care avem acești doi termeni, dar este suficient să spunem că având în vedere modul în care ActionScript compilează codul din panoul Script, o variabilă este de fapt o proprietate.

Dacă compilatorul ActionScript nu poate găsi proprietatea pe care ați specificat-o, o semnează cu eroarea de compilator 1120. Veți vedea ceva de genul:

 1120: Accesul la proprietăți nedefinite.

Unde "foo"este numele numelui dvs. de proprietate.

Rezolvarea acestui lucru este la fel de ușoară ca și obținerea corectă a numelui. Hai să aruncăm o privire.


Exemplul 1: Fără declarație variabilă

Luați acest cod de exemplu (dacă doriți, puteți deschide fereastra "dispărut"(proiectul numit" lipsă "din descărcarea sursei) sau creați singur acest proiect: creați doar un nou fișier Flash și o clasă de documente pentru acesta și puneți acest cod în clasa de documente):

 pachet import flash.display. *; clasa publică lipsă se extinde Sprite funcția publică lipsă () foo = "Moo."; 

Compilați acest FLA, și veți obține 1120: Accesul la proprietăți nedefinite. eroare, direcționată la linia 7.

Din nou, cauza este probabil foarte clară; nu ați declarat niciodată foo proprietatea și folosindu-l astfel în linia 7 ca și cum ar fi existat deja cauzează probleme. Soluția este de a declara pur și simplu variabila. Din punct de vedere tehnic, acest lucru poate exista oriunde în domeniul corespunzător. Fiecare dintre următoarele soluții sunt acceptabile:

Declarați-l ca parametru al metodei:

 funcția publică lipsă (foo: String) foo = "Moo."; 

Declarați-o drept o variabilă locală în interiorul metodei:

 funcția publică lipsă () var foo: String; foo = "Moo."; 

Declarați-o ca o proprietate instanță în clasă:

 pachet import flash.display. *; clasa publică lipsă se extinde Sprite private var foo: String; funcția publică lipsă () foo = "Moo."; 

Soluția depinde de ceea ce este potrivit cu ceea ce încercați să faceți. Nu este comună declararea unui parametru de metodă și apoi setarea pur și simplu în corpul metodei, deși există cazuri în care doriți să afectați valorile parametrilor.

Ceea ce ar putea fi interesant este modul în care Flash va căuta o variabilă a numelui. În primul rând, ea caută o variabilă locală a numelui foo. Dacă unul nu a fost declarat, atunci se uită la parametrii pentru acel nume. Dacă nu se găsește acolo, ea caută o proprietate de instanță cu același nume. Dacă nu se găsește niciunul dintre acestea, veți vedea eroarea 1120.


Exemplul 2: Un tip

Următorul exemplu va fi destul de similar. Din nou, puteți deschide pur și simplu "greșeală de scriere"de la descărcare sau să creeze un FLA simplu cu clasa de documente și să lipiți / tastați următorul cod în clasă sau pur și simplu să citiți.

 pachet import flash.display. *; clasa publică Typo extinde Sprite var foo: String; funcția publică Typo () boo = "Moo."; 

Nu se petrece prea mult aici. Ideea este de a declara o proprietate numită foo, și apoi în constructor setați această valoare "Moo.". Carnea de aici este pe liniile 5 și 9, evidențiate mai sus. Restul este doar boilerplate de clasă de documente.

Din nou, eroarea este, probabil, dureros de evidentă. Și, bineînțeles, atunci când există doar două linii de cod care vă îngrijorează. În mod clar avem o greșeală; am vrut să scriem:

 foo = "Moo.";

Și dacă rezolvați tipo, veți putea să compilați FLA fără eroarea 1120.

În timp ce acest lucru este evident, vreau să fac două note. Primul este că astfel de tipărite sunt de fapt oarecum obișnuite și mai greu de dedus când ai mii de linii de cod în proiectul tău. Un bun IDE sau editor de text vă poate ajuta prin furnizarea de completare automată sau de alte tipuri de verificare a erorilor, dar, ca și în cazul unei acțiuni facile, ActionScript vă va ajuta să realizați și o eroare 1120.

Cea de-a doua notă este că eroarea pe care ActionScript o raportează este că încercați să trimiteți o proprietate numită "nuu"dar nu găsim unul.În acest exemplu, am produs eroarea introducând o tipografie în codul nostru.Dar ActionScript nu știe că ai vrut cu adevărat"foo", presupune că atunci când scrieți"boo = "Moo.";"că ai vrut să spui nuu, și vă avertizează atunci când nu poate găsi o proprietate a acelui nume.

Aceasta este o distincție destul de subtilă, dar este util să țineți minte adevărata cauză a erorii.


Exemplul 3: Declararea instanțelor etapelor

Exemplul nostru final implică în special Flash IDE și poate fi ignorat în condiții de siguranță dacă nu utilizați Flash CS3 / 4/5 și utilizați în schimb Flash Builder cu Flex Framework. Configurarea erorii va face câțiva pași simpli.

Puteți găsi proiectul problematic în etapa instanță dosarul pachetului de descărcare. Sau puteți să o re-creați urmând acești pași:

  1. Începeți cu un nou fișier Flash și o clasă de documente asociate.
  2. În fișierul Flash, desenați o formă și transformați-o într-un simbol.
  3. Selectați instanța simbolului de pe scenă și deschideți panoul Proprietăți și denumiți instanța instance_mc.
  4. Încă în Flash, alegeți Fișier> Publicați setările apoi selectați bliț fila.
  5. Faceți clic pe Setări ... butonul de lângă meniul pop-up "Script:".
  6. Unde se spune Etapa: Declarați automat instanțele etapelor, asigurați-vă că este bifată caseta de selectare ONUselectat.
  7. Adăugați următorul cod în clasa de documente:

     pachet import flash.display. *; clasa publică StageInstance extinde Sprite funcția publică StageInstance () instance_mc.rotation = 45; 

În acest moment, mergeți mai departe și rulați filmul. Veți primi încă o dată eroarea 1120.

Așa cum s-ar putea să presupunem, dezactivarea opțiunii "Declare automată instanțe de scenă" a avut mult de-a face cu generarea erorii. Este o opțiune care este activată în mod implicit, deci probabil că aveți un motiv pentru - și fiți conștient de - oprirea acesteia.

Ce se întâmplă dacă e destul de explicabil, dar îmi voi adăuga cei doi cenți. Când aveți o clasă de documente (sau o clasă personalizată legată de un simbol din bibliotecă), această clasă se extinde spiriduș sau MovieClip. Regulile tipice pentru crearea de variabile și proprietăți se aplică la fel ca orice altă clasă, dar pentru că aveți o interfață vizuală pentru acest obiect - IDE-ul Flash - este posibil să adăugați implicit proprietăți prin trasarea mai multor simboluri pe scenă și oferindu-le nume de instanțe.

Dacă "Declarați automat instanțele de scenă" este activată, Flash va trece prin obiectele adăugate la etapă prin IDE și va introduce declarațiile de proprietate la clasele corespunzătoare pentru fiecare instanță de simbol cu ​​un nume.

Dacă este dezactivat, Flash nu va face nimic cu instanțele de pe scenă.

Pentru a evita eroarea, puteți activa această opțiune. Alternativ, puteți declara manual instanțele de scenă. Dacă am făcut ca clasa noastră de documente să arate astfel:

 pachet import flash.display. *; clasa publică StageInstance extinde Sprite public var instance_mc: MovieClip; funcția publică StageInstance () instance_mc.rotation = 45; 

Acest lucru ar evita, de asemenea, eroarea, deoarece proprietatea este încă declarată; acesta nu a fost declarat automat de Flash Professional.

Rețineți că în cazul în care modificatorul de acces nu este public veți primi o eroare de execuție. Nu voi intra în detaliu cu privire la această eroare; care va fi pentru un alt sfat rapid.

Acum, de ce ați vrea vreodată să renunțați la această opțiune în primul rând? Cred că toate motivele sunt legate de mutarea dincolo de Flash ca instrument de dezvoltare. Dacă utilizați Flash Builder pentru a codifica sau ASDoc sau pentru a integra conținutul Flash într-un proiect Flex, puteți aprecia ramificațiile opririi opțiunii. Dacă îl dezactivați, atunci sunteți obligat să declarați proprietățile manual. Opusul este, de asemenea, adevărat: dacă îl porniți, sunteți forțat să nu declarați manual aceste proprietăți.

Astfel, dacă rulați fișierele de clasă prin ASDoc, va găsi cel mai probabil o referință la o instanță de scenă, dar nu și la declarația ei și veți primi eroarea 1120. Activarea opțiunii este o conveniență, dar oprirea acesteia vă forțează pentru a scrie mai mult cod "pur", care este mai portabil și autonom.


Declar acest sfat rapid

Ca multe erori, Error 1120 este simplu la inimă și este ușor de rezolvat odată ce știți ce să căutați. Vă mulțumim pentru lectură și rămâneți la dispoziție pentru mai multe sfaturi de depanare rapidă!

Cod