Snelle tip Hoe debug een AS3-fout # 1120

Een veel voorkomende ActionScript-fout is Error 1120, de fout 'ongedefinieerde eigenschap'. Dit is in feite de meest voorkomende fout tijdens het compileren. De oorzaak is heel eenvoudig, maar er zijn een aantal manieren waarop het daadwerkelijk kan worden geïnduceerd. We zullen een korte rondleiding geven in enkele van de scenario's waarin u deze fout tegenkomt en hoe u deze kunt oplossen.


De toelichting

Laten we eerst het algemene idee krijgen van wat er met deze fout aan de hand is. Dit zal onze theoretische discussie zijn; we zullen meer praktische voorbeelden krijgen in de rest van de tip.

U vindt deze fout optreedt wanneer u een verwijzing naar een variabele (of eigenschap) in een regel code, maar die variabele bestaat niet. Als je gewend bent om ActionScript te schrijven in het scriptvenster en niet in klassen, laat je dan niet afschrikken door de term 'property'. Ik ga niet in op een lange discussie over waarom we deze twee termen hebben, maar volstaat om te zeggen dat gezien de manier waarop ActionScript code uit het Script-paneel verzamelt, een variabele feitelijk een eigenschap is.

Als de ActionScript-compiler de door u opgegeven eigenschap niet kan vinden, wordt deze gemarkeerd met compiler error 1120. U ziet zoiets als dit:

 1120: Toegang tot ongedefinieerde eigendom foo.

Waar "foo"is de naam van de naam van je aanstootgevende eigendom.

Meestal is dit even gemakkelijk als het rechtzetten van de naam. Laten we kijken.


Voorbeeld 1: Geen variabele verklaring

Neem deze code bijvoorbeeld (als je wilt, kun je ofwel de "missend"voorbeeldproject (dat wil zeggen, het project met de naam" ontbrekend "in de brondownload) of maak dit project alleen: maak hiervoor gewoon een nieuw Flash-bestand en een documentklasse aan en plaats deze code in de documentklasse):

 pakket import flash.display. *; public class Missing breidt Sprite uit public function Missing () foo = "Moo."; 

Compileer deze FLA, en je krijgt de 1120: Toegang tot ongedefinieerde eigendom foo. fout, gericht op regel 7.

Nogmaals, de oorzaak is waarschijnlijk heel duidelijk; je hebt het nooit verklaard foo eigendom en dus gebruiken in regel 7 alsof het al bestond, veroorzaakt problemen. De oplossing is om de variabele eenvoudigweg te declareren. Technisch gezien kan dit overal in de juiste scope voorkomen. Elk van de volgende zijn aanvaardbare oplossingen:

Verklaar het als een parameter voor de methode:

 openbare functie ontbreekt (foo: String) foo = "Moo."; 

Verklaar het als een lokale variabele binnen de methode:

 openbare functie ontbreekt () var foo: String; foo = "Moo."; 

Verklaren als een instantie in de klasse:

 pakket import flash.display. *; public class Missing breidt Sprite uit private var foo: String; openbare functie ontbreekt () foo = "Moo."; 

De oplossing hangt af van wat geschikt is voor wat u probeert te doen. Het is niet gebruikelijk om een ​​methodeparameter te declareren en deze eenvoudig in de body van de methode in te stellen, hoewel er gevallen zijn waarin u de parameterwaarden wilt beïnvloeden.

Wat misschien interessant is, is de manier waarop Flash naar een variabele van de naam zoekt. Eerst zoekt het naar een lokale variabele van de naam foo. Als er een niet is opgegeven, worden de parameters voor die naam bekeken. Als het daar geen kan vinden, zoekt het naar een instantie-eigenschap met dezelfde naam. Als geen van deze worden gevonden, ziet u fout 1120.


Voorbeeld 2: een typo

Ons volgende voorbeeld zal vrij gelijkaardig zijn. Nogmaals, je kunt eenvoudig de "typfout"projecteer van de download of maak een eenvoudige FLA met documentklasse en plak / typ de volgende code in de klas, of lees gewoon mee.

 pakket import flash.display. *; public class Typo breidt Sprite uit var foo: String; openbare functie Typo () boo = "Moo."; 

Er gebeurt hier niet veel. Het idee is om een ​​eigenschap genaamd te declareren foo, en stel dat in de constructor in op de waarde "Loeien.". Het vlees hiervan is op de lijnen 5 en 9, hierboven gemarkeerd. De rest is alleen document klasse boilerplate.

Nogmaals, de fout is waarschijnlijk pijnlijk duidelijk. En dat is het natuurlijk ook, als er maar twee regels code zijn om je zorgen over te maken. Het is duidelijk dat we een typfout hebben; we wilden schrijven:

 foo = "Moo.";

En als u de typfout oplost, kunt u de FLA compileren zonder de 1120-fout.

Hoewel deze duidelijk is, wil ik twee opmerkingen maken. De eerste is dat typefouten als deze eigenlijk iets gebruikelijk zijn en moeilijker te deduceren als je duizenden regels code in je project hebt. Een goede IDE- of teksteditor kan u helpen door autocompletion of andere soorten foutcontrole aan te bieden, maar als een failsafe ActionScript zal het u ook helpen door de Error 1120 te produceren.

De tweede opmerking is dat de fout die ActionScript feitelijk meldt, is dat u probeert te verwijzen naar een eigenschap genaamd "boe", maar het is er geen vinden. In dit voorbeeld hebben we de fout veroorzaakt door een typfout in onze code te introduceren, maar ActionScript weet niet dat u het echt meende"foo"; het gaat ervan uit dat wanneer je schrijft"boo = "Moo.";"dat bedoelde je boe, en waarschuwt u wanneer het een eigenschap van die naam niet kan vinden.

Dit is een nogal subtiel onderscheid, maar het is nuttig om de ware oorzaak van de fout in gedachten te houden.


Voorbeeld 3: Stage-instanties declareren

Ons laatste voorbeeld is met name de Flash IDE en kan veilig worden genegeerd als u Flash CS3 / 4/5 niet gebruikt en in plaats daarvan Flash Builder met het Flex Framework gebruikt. Het instellen van de fout zal een paar eenvoudige stappen vereisen.

Je kunt het problematische project vinden in de stage aanleg map van het downloadpakket. Of u kunt het opnieuw maken door deze stappen te volgen:

  1. Begin met een nieuw Flash-bestand en bijbehorende documentklasse.
  2. Teken in het Flash-bestand een vorm en verander het in een symbool.
  3. Selecteer de symboolinstantie op het werkvlak en open het paneel Eigenschappen en geef de instantie een naam instance_mc.
  4. Kies nog steeds in Flash Bestand> Publicatie-instellingen selecteer vervolgens de Flash tab.
  5. Klik op de Instellingen ... knop naast het pop-upmenu "Script:".
  6. Waar is zegt Stadium: declaraties van een stage automatisch declareren, zorg ervoor dat het selectievakje is ingeschakeld ungekozen.
  7. Voeg de volgende code toe aan de documentklasse:

     pakket import flash.display. *; public class StageInstance breidt openbare functie StageInstance () instance_mc.rotation = 45; 

Ga nu door en voer de film uit. U krijgt opnieuw de 1120-fout.

Zoals je misschien wel kunt vermoeden, had het uitschakelen van "Automatisch stadiuminstanties declareren" veel te maken met het genereren van de fout. Het is een optie die standaard is ingeschakeld, dus je hebt waarschijnlijk een reden voor - en let op - het uit te schakelen.

Wat is doet als redelijk vanzelfsprekend, maar ik zal mijn twee cent toevoegen. Wanneer u een documentklasse (of een aangepaste klasse gekoppeld aan een symbool in de bibliotheek) heeft, wordt die klasse uitgebreid sprite of Filmclip. De typische regels voor het maken van variabelen en eigenschappen zijn net zoals elke andere klasse van toepassing, maar omdat je een visuele interface hebt met dit object - de Flash IDE - kun je impliciet eigenschappen toevoegen door meer symbolen in het werkgebied te tekenen en ze instantienamen te geven.

Als "Automatisch statusinstellingen declareren" is ingeschakeld, doorloopt Flash de objecten die via de IDE aan het werkgebied zijn toegevoegd en voegt het eigenschapsverklaringen toe aan de desbetreffende klassen voor elk symboolexemplaar met een naam.

Als het uit is, dan zal Flash niets doen met de instanties op het podium.

Om de fout te voorkomen, kunt u eenvoudig deze optie weer inschakelen. Als alternatief kunt u de fase-exemplaren handmatig declareren. Als we onze documentklasse er zo uit laten zien:

 pakket import flash.display. *; public class StageInstance breidt uit met Sprite public var instance_mc: MovieClip; openbare functie StageInstance () instance_mc.rotation = 45; 

Dit zou ook de fout voorkomen, omdat het eigendom nog steeds wordt aangegeven; het is gewoon niet automatisch verklaard door Flash Professional.

Merk op dat als de toegangsmodificator dat niet is openbaar u krijgt een runtime-fout. Ik ga niet in detail treden op deze fout; dat zal voor een andere snelle tip zijn.

Waarom zou je die optie ooit eerst willen uitschakelen? Ik denk dat de redenen allemaal te maken hebben met verder gaan dan Flash als een ontwikkelingshulpmiddel. Als u Flash Builder gebruikt om te coderen, of ASDoc, of Flash-inhoud te integreren in een Flex-project, zou u de consequenties van het uitschakelen van de optie kunnen waarderen. Als u het uitschakelt, moet u de eigenschappen handmatig declareren. Het tegendeel is ook waar: als je het aanzet, ben je gedwongen om niet geef deze eigenschappen handmatig op.

Dus als u uw klassebestanden uitvoert via ASDoc, zal het hoogstwaarschijnlijk een verwijzing naar een fase-instantie vinden, maar niet naar de verklaring ervan, en u ontvangt fout 1120. De optie inschakelen is een gemak, maar als u deze uitschakelt, wordt u gedwongen om meer "zuivere" code te schrijven die draagbaarder en zelfstandiger is.


Ik verklaar deze snelle tip gedaan

Net als veel fouten is Error 1120 eenvoudig van hart en gemakkelijk te herstellen als u eenmaal weet waar u op moet letten. Bedankt voor het lezen en blijf op de hoogte voor meer Quick Tips voor foutopsporing!