Zoeken…


Invoering

Een fout 1009 is een algemene fout die optreedt wanneer u probeert een waarde te ontvangen van een variabele of eigenschap met de waarde null . De gegeven voorbeelden leggen verschillende gevallen bloot waarin deze fout zich voordoet, samen met enkele aanbevelingen om de fout te verminderen.

Opmerkingen

De gevreesde en vaak gestelde "Fout 1009: Geen toegang tot een eigenschap of methode van een nul objectreferentie" is een signaal dat sommige van de gegevens nul lijken, maar wordt geprobeerd te worden gebruikt als een bevolkt object. Er zijn behoorlijk veel soorten problemen die dit gedrag kunnen veroorzaken, en elk probleem moet worden getest met de code waarin de fout is ontstaan.

Stage is niet beschikbaar

Soms schrijven ontwikkelaars code die toegang tot het stage of Flash-podium verlangt om luisteraars toe te voegen. Het kan voor de eerste keer werken, dan werkt het plotseling niet en produceert het de fout 1009. De code in kwestie kan zelfs op de tijdlijn staan, omdat het het eerste initiatief is om daar code toe te voegen, en veel zelfstudies die nog steeds bestaan tijdlijn codelaag om de code te plaatsen.

public class Main extends MovieClip {
    public function Main() {
        stage.addEventListener(Event.ENTER_FRAME,update); // here

De reden dat deze code niet werkt is eenvoudig: een weergaveobject wordt eerst geïnstantieerd en vervolgens aan de weergavelijst toegevoegd, en hoewel het niet in de weergavelijst staat, is het stage nul.

Erger nog als de code als volgt:

stage.addEventListener(Event.ENTER_FRAME,update); // here

wordt op de tijdlijn geplaatst. Het kan zelfs werken voor enige tijd, terwijl de Main object wordt geslagen naar het podium via GUI. Vervolgens wordt hun SWF van een andere SWF geladen en ineens breekt de code. Dit gebeurt omdat de frames van de Main op een andere manier worden opgebouwd wanneer de SWF rechtstreeks door de speler wordt geladen en wanneer het laden asynchroon wordt verwerkt. De oplossing is om Event.ADDED_TO_STAGE luisteraar te gebruiken en alle code die het podium bevat erin te plaatsen en de luisteraar zelf in een AS-bestand te plaatsen in plaats van de tijdlijn.

Ongeldige typecast

function listener(e:Event):void {
    var m:MovieClip=e.target as MovieClip;
    m.x++;
}

Als een dergelijke luisteraar is gekoppeld aan een object dat geen MovieClip afstammeling is (bijvoorbeeld een Sprite ), mislukt de typecast en geven alle volgende bewerkingen met het resultaat de 1009-fout.

Niet-geïnstantieerd object

var a:Object;
trace(a); // null
trace(a.b); // Error 1009

Hier wordt een objectverwijzing opgegeven, maar er wordt nooit een waarde toegewezen, of het nu een new of een niet-nulwaarde. Het aanvragen van de eigenschappen of methode resulteert in een 1009-fout.

Gelaagde expressie

x=anObject.aProperty.anotherProperty.getSomething().data;

Hier kan elk object vóór de stip nul zijn en het gebruik van methoden die complexe objecten retourneren, verhoogt alleen de complicatie om de fout null te debuggen. In het ergste geval, als de methode vatbaar is voor externe fouten, zeg dan het ophalen van gegevens via het netwerk.

Onverwerkt functieresultaat

s=this.getChildByName("garbage");
if (s.parent==this) {...}

getChildByName() is een van de vele functies die null kunnen retourneren als er een fout is opgetreden bij het verwerken van de invoer. Controleer daarom eerst op null als u een object ontvangt van een functie die mogelijk null kan retourneren. Hier wordt een eigenschap onmiddellijk opgevraagd zonder eerst te controleren of s nul is, dit zal de 1009-fout genereren.

Vergeten gebeurtenisluisteraar

addEventListener(Event.ENTER_FRAME,moveChild);
function moveChild(e:Event):void {
    childMC.x++;
    if (childMC.x>1000) {
        gotoAndStop(2);
    }
}

Dit voorbeeld zal de childMC verplaatsen (toegevoegd aan Main tijdens het ontwerp), maar zal onmiddellijk een 1009 gooien zodra gotoAndStop() wordt aangeroepen, als die childMC niet op frame 2 bestaat. De primaire reden hiervoor is dat telkens wanneer een afspeelkop passeert een keyframe (een frame dat de objectset van het vorige frame niet overneemt), hetzij door gotoAndStop() , gotoAndPlay() waarbij het bestemmingsframe wordt gescheiden van het huidige frame door een keyframe, of door normaal afspelen als de SWF een animatie, wordt de inhoud van het huidige frame vernietigd en wordt de nieuwe inhoud gemaakt met behulp van de gegevens die zijn opgeslagen vanuit GUI. Dus als het nieuwe frame geen kind met de naam childMC , wordt het eigenschapsverzoek null geretourneerd en wordt 1009 geworpen.

Hetzelfde principe is van toepassing als u twee gebeurtenislisteners toevoegt, maar slechts één verwijdert, of een luisteraar toevoegt aan het ene object, maar probeert van een ander te verwijderen. De aanroep removeEventListener waarschuwt u niet als aan het object geen bijbehorende gebeurtenislistener is gekoppeld. Lees daarom de code die gebeurtenisluisteraars toevoegt en verwijdert zorgvuldig.

Opmerking: met het gebruik van Timer objecten, roept het aanroepen van setInterval() en setTimeout() ook gebeurtenislisteners, en deze moeten ook correct worden gewist.

Ongeldige verwijzing naar een op een frame gebaseerd object

Soms wordt gotoAndStop() in het midden van de code genoemd die naar op frames gebaseerde eigenschappen verwijst. Maar direct nadat het frame is gewijzigd, worden alle koppelingen naar eigenschappen die op het huidige frame bestonden ongeldig, dus elke verwerking waarbij ze betrokken zijn, moet onmiddellijk worden beëindigd.

Er zijn twee algemene scenario's voor een dergelijke verwerking: ten eerste eindigt een lus niet na het aanroepen van gotoAndStop() , zoals hier:

for each (bullet in bullets) {
    if (player.hitTestObject(bullet)) gotoAndStop("gameOver");
}

Hier betekent een 1009-fout dat de player MC is vernietigd tijdens het verwerken van de aanroep gotoAndStop() , maar de lus gaat door en verwijst naar de nu- hitTestObject() om hitTestObject() uit te halen. Als de voorwaarde zou zeggen if (bullet.hitTestObject(player)) plaats daarvan zou de fout # 2007 zijn "Parameter hitTestObject mag niet null zijn". De oplossing is om een return statement direct na het aanroepen van gotoAndStop() .

Tweede geval zijn meerdere gebeurtenisluisteraars op hetzelfde evenement. Soortgelijk:

stage.addEventListener(Event.ENTER_FRAME,func1);
stage.addEventListener(Event.ENTER_FRAME,func2);
function func1(e:Event):void {
    if (condition()) {
        gotoAndStop(2);
    }
}

Hier, als condition() waar is, zou de eerste luisteraar gotoAndStop() , maar de tweede luisteraar zou nog steeds worden uitgevoerd, en als die naar objecten op het frame verwijst, wordt een 1009-fout gegenereerd. De oplossing is om meerdere luisteraars te vermijden bij een enkele gebeurtenis, in een enkel object, het is beter om een luisteraar te hebben die alle situaties bij die gebeurtenis afhandelt en die correct kan worden beëindigd als een beeldwisseling nodig is.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow