Snabbtips Så här debuggar du ett AS3-fel # 1120

Ett mycket vanligt ActionScript-fel är Error 1120, felet "odefinierad egenskap". Faktum är att detta kan vara det vanligaste kompileringsfelet. Dess orsak är mycket enkel, men det finns ett antal sätt som det faktiskt kan induceras. Vi tar en snabb rundtur i några av de scenarier där du stöter på det här felet och hur du fixar dem.


Förklaringen

Låt oss först få den allmänna idén om vad som händer med detta fel. Detta kommer att bli vår teoretiska diskussion; vi kommer till mer praktiska exempel i resten av spetsen.

Du hittar det här felet när du hänvisar till en variabel (eller egenskap) i en kodrad, men den variabeln finns inte. Om du är van att skriva ActionScript på Script-panelen, och inte i klasser, ska du inte avbrytas av begreppet "egenskap". Jag kommer inte att komma in på en lång diskussion om varför vi har dessa två termer, men det är tillräckligt att säga att med tanke på hur ActionScript kompilerar kod från Script-panelen är en variabel egentligen en egenskap.

Om ActionScript-kompilatorn inte kan hitta den egenskap du har angett, flaggar den med kompilatorfel 1120. Du ser något så här:

 1120: Tillgång till odefinierad egendom foo.

Var "foo"är namnet på ditt förekommande egendomsnamn.

Att lösa det här är oftast lika enkelt som att få namnet rätt. Låt oss ta en titt.


Exempel 1: Ingen variabel deklaration

Ta den här koden till exempel (om du vill kan du antingen öppna "saknas"exemplarprojekt (det vill säga projektet heter" missing "i källnedladdningen) eller skapa det här projektet på egen hand: bara skapa en ny Flash-fil och en dokumentklass för den och sätt den här i dokumentklassen):

 paket import flash.display. *; offentlig klass saknas sträcker sig Sprite public function Missing () foo = "Moo."; 

Kompilera denna FLA, och du får den 1120: Tillgång till odefinierad egendom foo. fel, riktat till linje 7.

Återigen är orsaken förmodligen mycket tydlig; du har aldrig förklarat foo egendom och så använder den i rad 7 som om den redan existerade orsakar problem. Lösningen är att enkelt deklarera variabeln. Tekniskt kan detta existera någonstans inom lämplig räckvidd. Var och en av följande är acceptabla lösningar:

Förklara det som en parameter för metoden:

 Offentlig funktion saknas (foo: String) foo = "Moo."; 

Förklara det som en lokal variabel inuti metoden:

 allmän funktion saknas () var foo: String; foo = "Moo."; 

Förklara det som en egendom i klassen:

 paket import flash.display. *; offentlig klass saknas sträcker sig Sprite privat var foo: String; offentlig funktion saknas () foo = "Moo."; 

Lösningen beror på vad som är lämpligt för vad du försöker göra. Det är inte vanligt att deklarera en metodparameter och sedan ställa in den i metalkroppen, även om det finns fall där du vill påverka parametervärdena.

Det som kan vara intressant är hur Flash söker efter en variabel av namnet. Först letar den efter en lokal variabel av namnet foo. Om en inte var deklarerad ser den på parametrarna för det namnet. Om den inte hittar någon där, letar den efter en instansegenskap med samma namn. Om ingen av dessa finns kan du se fel 1120.


Exempel 2: En typo

Vårt nästa exempel kommer att bli ganska likartat. Återigen kan du helt enkelt öppna "stavfel"projekt från nedladdningen, eller skapa en enkel FLA med dokumentklass och klistra in / skriv in följande kod i klassen, eller läs bara med.

 paket import flash.display. *; public class Typo utökar Sprite var foo: String; allmän funktion Typo () boo = "Moo."; 

Det går inte mycket här. Tanken är att deklarera en egendom som heter foo, och sedan i konstruktorn sätta det till värdet "Mu.". Köttet av detta är på linjerna 5 och 9, framhävs ovan. Resten är bara dokument klasspanna.

Återigen är felet troligen smärtsamt uppenbart. Och det är självklart, när det bara finns två koder som berör dig. Tydligen har vi ett typsnitt; vi menade att skriva:

 foo = "Moo.";

Och om du fixar skrivbordsskrivaren kan du kompilera FLA utan 1120-felet.

Medan det här är uppenbart, vill jag göra två anteckningar. Det första är att typsnitt som detta är faktiskt lite vanligt och svårare att härleda när du har tusentals linjer kod i ditt projekt. En bra IDE eller textredigerare kan hjälpa dig genom att tillhandahålla autokomplettering eller andra typer av felkontroll, men som en felsäker ActionScript hjälper dig också genom att skapa Error 1120.

Den andra anmärkningen är att felet som ActionScript faktiskt rapporterar är att du försöker referera till en egenskap som heter "bua", men det är inte att hitta en. I det här exemplet har vi skapat felet genom att införa ett typsnitt i vår kod. Men ActionScript vet inte att du verkligen menade"foo"; det förutsätter att när du skriver"boo = "Moo.";"som du menade bua, och varnar dig när det inte kan hitta en egendom av det namnet.

Det här är en ganska subtil distinktion, men det är bra att komma ihåg den verkliga orsaken till felet.


Exempel 3: Deklarera scenframställningar

Vårt sista exempel gäller särskilt Flash IDE och kan säkert ignoreras om du inte använder Flash CS3 / 4/5, och istället använder Flash Builder med Flex Framework. Om du ställer in felet kommer du att ta några enkla steg.

Du kan hitta det problematiska projektet i stadium-instans mappen på hämtningspaketet. Eller du kan skapa det igen genom att följa dessa steg:

  1. Börja med en ny Flash-fil och tillhörande dokumentklass.
  2. I Flash-filen ritar du en form av något slag och gör det till en symbol.
  3. Markera symbolinstansen på scenen och öppna Egenskaper-panelen och ange förekomsten instance_mc.
  4. Fortfarande i Flash, välj Arkiv> Publiceringsinställningar välj sedan Blixt flik.
  5. Klicka på Inställningar… knappen bredvid popupmenyn "Script:".
  6. Var står det Steg: Automatisk deklarera scenförekomster, se till att kryssrutan är fnvald.
  7. Lägg till följande kod i dokumentklassen:

     paket import flash.display. *; public class StageInstance utökar Sprite public function StageInstance () instance_mc.rotation = 45; 

Vid denna tid, fortsätt och köra filmen. Du kommer återigen få 1120-felet.

Som du kanske skulle kunna tycka om, stängde av "Automatiskt deklarera scenförekomster" haft mycket att göra med att fel uppstod. Det är ett alternativ som är aktiverat som standard, så du skulle noga ha en anledning till - och vara medveten om - att stänga av den.

Vad gör det om ganska självförklarande, men jag lägger till mina två cent. När du har en dokumentklass (eller en anpassad klass kopplad till en symbol i biblioteket), utökar den klassen Sprite eller Filmklipp. De typiska reglerna för att skapa variabler och egenskaper gäller precis som någon annan klass, men eftersom du har ett visuellt gränssnitt till det här objektet - Flash IDE - kan du implicit lägga till egenskaper genom att dra fler symboler på scenen och ge dem förekomstnamn.

Om "Automatiskt deklarera sceninstanser" är på, kommer Flash att gå igenom de objekt som läggs till scenen genom IDE och infoga egenskapsdeklarationer till lämpliga klasser för varje symbolinstans med ett namn.

Om det är avstängd, kommer Flash inte att göra något med instanserna på scenen.

För att undvika felet kan du helt enkelt aktivera det här alternativet igen. Alternativt kan du manuellt deklarera scenförekomsterna. Om vi ​​gjorde vår dokumentklass så här ser du ut:

 paket import flash.display. *; public class StageInstance utökar Sprite public var instance_mc: MovieClip; allmän funktion StageInstance () instance_mc.rotation = 45; 

Detta skulle också undvika felet, eftersom egenskapen fortfarande är deklarerad; det har inte blivit förklarat automatiskt av Flash Professional.

Observera att om åtkomstmodifieraren inte är offentlig du får ett runtime-fel. Jag kommer inte att gå in i detalj om detta fel; det kommer att vara en annan snabb tips.

Nu, varför skulle du någonsin vilja släcka det alternativet i första hand? Jag tror att alla skäl har att göra med att flytta bortom Flash som ett utvecklingsverktyg. Om du använder Flash Builder för att koda, eller ASDoc, eller integrera Flash-innehåll inom ett Flex-projekt, kan du uppskatta omfördelningarna för att stänga av alternativet. Om du stänger av den, måste du då förklara egenskaperna manuellt. Det motsatta är också sant: om du slår på den, är du tvungen att inte Manuellt deklarera dessa egenskaper.

Om du kör dina klassfiler via ASDoc, kommer det alltså troligtvis att finnas en referens till en sceninstans, men inte dess deklaration, och du får fel 1120. Om du väljer alternativet är det enkelt, men att stänga av dig tvingar dig att skriva mer "ren" kod som är mer bärbar och fristående.


Jag förklarar denna snabba tips klar

Som många fel är Error 1120 enkelt i hjärtan, och lätt att fixa när du vet vad du ska leta efter. Tack för att du läste, och håll dig uppdaterad för mer felsökning Snabbtips!