Hurtig Tips Slik Debugger du en AS3 Error # 1120

En meget vanlig ActionScript-feil er Feil 1120, feilen "Udefinert egenskap". Faktisk kan dette være den vanligste kompileringstidsfeilen. Årsaken er veldig enkel, men det er en rekke måter det faktisk kan bli indusert. Vi tar en rask gjennomgang av noen av scenariene der du vil oppleve denne feilen, og hvordan du kan fikse dem.


Forklaringen

Først, la oss få den generelle ideen om hva som skjer med denne feilen. Dette blir vår teoretiske diskusjon; Vi kommer til flere praktiske eksempler i resten av spissen.

Du finner denne feilen oppstår når du refererer til en variabel (eller egenskap) i en linje med kode, men den variabelen eksisterer ikke. Hvis du er vant til å skrive ActionScript på Skriptpanelet, og ikke i klasser, må du ikke bli avvist av begrepet "eiendom". Jeg vil ikke komme inn i en lang diskusjon om hvorfor vi har disse to begrepene, men det er nok å si at i takt med at ActionScript kompilerer kode fra Skriptpanelet, er en variabel faktisk en eiendom.

Hvis ActionScript-kompilatoren ikke kan finne eiendommen du har angitt, flagger den den med kompilatorfeil 1120. Du ser noe slikt:

 1120: Tilgang til udefinert eiendom foo.

Hvor "foo"er navnet på ditt fornærmende eiendomsnavn.

Å løse dette er like enkelt som å få navnet riktig. La oss ta en titt.


Eksempel 1: Ingen variabel erklæring

Ta denne koden for eksempel (hvis du vil, kan du enten åpne opp "savnet"eksempel prosjekt (det vil si prosjektet heter" missing "i kilde nedlasting) eller opprett dette prosjektet på egen hånd: bare opprett en ny Flash-fil og en dokumentklasse for den, og sett denne koden i dokumentklassen):

 pakke import flash.display. *; offentlig klasse Mangler strekker seg til Sprite offentlig funksjon mangler () foo = "Moo."; 

Kompil dette FLA, og du får den 1120: Tilgang til udefinert eiendom foo. feil, rettet mot linje 7.

Igjen er årsaken sannsynligvis veldig tydelig; du har aldri erklært foo eiendom og så bruker den i linje 7 som om den allerede eksisterte, forårsaker problemer. Løsningen er å bare erklære variabelen. Teknisk kan dette eksistere hvor som helst i passende omfang. Hver av de følgende er akseptable løsninger:

Erklære det som en parameter til metoden:

 offentlig funksjon Mangler (foo: String) foo = "Moo."; 

Erklære det som en lokal variabel inne i metoden:

 offentlig funksjon Mangler () var foo: String; foo = "Moo."; 

Erklære det som en eiendom i klassen:

 pakke import flash.display. *; offentlig klasse Mangler utvider Sprite private var foo: String; offentlig funksjon Mangler () foo = "Moo."; 

Løsningen avhenger av hva som passer til det du prøver å gjøre. Det er ikke vanlig å deklarere en metodeparameter og deretter bare sette den i metalkroppen, selv om det er tilfeller hvor du vil påvirke parameterverdiene.

Det som kan være interessant er måten Flash søker etter en variabel av navnet. Først ser det ut til en lokal variabel av navnet foo. Hvis en ikke ble erklært, ser den på parametrene for det navnet. Hvis den ikke finner en der, ser den etter en forekomst av samme navn. Hvis ingen av disse er funnet, vil du se feil 1120.


Eksempel 2: En Typo

Vårt neste eksempel vil være ganske like. Igjen kan du bare åpne opp "skrivefeil"prosjektet fra nedlastingen, eller lag en enkel FLA med dokumentklasse og lim / skriv inn følgende kode i klassen, eller bare les videre.

 pakke import flash.display. *; offentlig klasse Typo utvider Sprite var foo: String; offentlig funksjon Typo () boo = "Moo."; 

Det skjer ikke mye her. Tanken er å erklære en eiendom som kalles foo, og deretter i konstruktøren satt det til verdien "Moo".. Kjøttet av dette er på linje 5 og 9, fremhevet ovenfor. Resten er bare dokument klasse boilerplate.

Igjen er feilen trolig smertelig åpenbar. Og selvfølgelig er det, når det bare er to linjer med kode for å bekymre deg selv. Tydeligvis har vi en skrivefeil; vi mente å skrive:

 foo = "Moo.";

Og hvis du fikser skrivefeltet, kan du kompilere FLA uten 1120-feilen.

Mens denne er åpenbar, vil jeg lage to notater. Den første er at skrivefeil som dette er faktisk noe vanlig og vanskeligere å utlede når du har tusenvis av kodelinjer i prosjektet ditt. En god IDE eller tekstredigerer kan hjelpe deg ved å gi autofullføring eller andre typer feilkontroll, men som en feilbar ActionScript vil også hjelpe deg ved å produsere feil 1120.

Det andre notatet er at feilen som ActionScript faktisk rapporterer er at du forsøker å referere til en eiendom som heter "boo", men det er ikke å finne en. I dette eksemplet har vi produsert feilen ved å introdusere en skrivefeil i vår kode. Men ActionScript vet ikke at du virkelig mente"foo"; det antar at når du skriver"boo = "Moo.";"som du mente boo, og advarer deg når den ikke finner en eiendom av det navnet.

Dette er en ganske subtil forskjell, men det er nyttig å huske på den sanne årsaken til feilen.


Eksempel 3: Deklarering av scener

Vårt siste eksempel innebærer spesielt Flash IDE, og kan sikkert ignoreres hvis du ikke bruker Flash CS3 / 4/5, og i stedet bruker Flash Builder med Flex Framework. Hvis du konfigurerer feilen, tar du noen enkle trinn.

Du kan finne det problematiske prosjektet i scene-forekomst mappe av nedlastingspakken. Eller du kan gjenopprette den ved å følge disse trinnene:

  1. Start med en ny Flash-fil og tilhørende dokumentklasse.
  2. I Flash-filen tegner du en form av noe slag og gjør det til et symbol.
  3. Velg symboleksemplet på scenen og åpne Egenskaper panelet, og oppgi forekomsten instance_mc.
  4. Fortsatt i Flash, velg Fil> Publiser innstillinger velg deretter Blits tab.
  5. Klikk på Innstillinger ... knappen ved siden av "Skript:" lokalmenyen.
  6. Hvor står det? Stage: Oppgi automatisk forekomst av scener, kontroller at avkrysningsruten er unvalgt.
  7. Legg til følgende kode i dokumentklassen:

     pakke import flash.display. *; offentlig klasse StageInstance utvider Sprite public function StageInstance () instance_mc.rotation = 45; 

På dette tidspunktet, fortsett og kjør filmen. Du får nok en gang 1120-feilen.

Som du kanskje kan overtale, slår du av "Automatisk deklarert scenevaner", har mye å gjøre med genereringen av feilen. Det er et alternativ som er slått på, så du vil nok ha grunn til - og vær oppmerksom på - slå den av.

Hva gjør det hvis det er ganske selvforklarende, men jeg legger til mine to cent. Når du har en dokumentklasse (eller en egendefinert klasse knyttet til et symbol i biblioteket), utvider denne klassen Sprite eller Filmklipp. De typiske reglene for å skape variabler og egenskaper gjelder akkurat som alle andre klasser, men fordi du har et visuelt grensesnitt til dette objektet - Flash IDE - kan du implisitt legge til egenskaper ved å tegne flere symboler på scenen og gi dem forekomstnavn.

Hvis "Automatisk erklæring av scenevaner" er på, vil Flash gå gjennom objekter som er lagt til scenen gjennom IDE og sette inn eiendomsklarasjoner til de aktuelle klassene for hver symboleksempel med et navn.

Hvis det er av, vil Flash ikke gjøre noe med forekomstene på scenen.

For å unngå feilen, kan du ganske enkelt slå dette alternativet på igjen. Alternativt kan du manuelt erklære scenetilfellene. Hvis vi gjorde vår dokumentklasse se slik ut:

 pakke import flash.display. *; offentlig klasse StageInstance utvider Sprite public var instance_mc: MovieClip; offentlig funksjon StageInstance () instance_mc.rotation = 45; 

Dette ville også unngå feilen fordi eiendommen fortsatt er erklært; det har ikke blitt deklarert automatisk av Flash Professional.

Merk at hvis tilgangsmodifiseringen ikke er offentlig du får en runtime feil. Jeg kommer ikke til å gå i detalj på denne feilen; det vil være for en annen rask tips.

Nå, hvorfor vil du noen gang vil slå det alternativet av i utgangspunktet? Jeg tror at årsakene alle har å gjøre med å bevege seg utover Flash som et utviklingsverktøy. Hvis du bruker Flash Builder til å kode, eller ASDoc, eller integrere Flash-innhold i et Flex-prosjekt, kan du sette pris på konsekvensene ved å slå av alternativet. Hvis du slår den av, er du nødt til å deklarere egenskapene manuelt. Det motsatte er også sant: Hvis du slår på den, er du tvunget til ikke deklarer disse egenskapene manuelt.

Dermed, hvis du kjører klassefilene dine gjennom ASDoc, vil det mest sannsynlig finne en referanse til et scenemønster, men ikke dens erklæring, og du får feil 1120. Å slå på alternativet er en bekvemmelighet, men å slå av den tvinger deg å skrive mer "ren" kode som er mer bærbar og selvstendig.


Jeg erklærer denne raske tipsen ferdig

Feil 1120 er, som mange feil, enkel i hjertet, og lett å fikse når du vet hva du skal se etter. Takk for at du leser, og hold deg oppdatert for mer feilsøking!