Suche…


Einführung

Ein Fehler 1009 ist ein allgemeiner Fehler, der auftritt, wenn Sie versuchen, einen Wert aus einer Variablen oder Eigenschaft mit dem Wert null . Die bereitgestellten Beispiele zeigen verschiedene Fälle auf, in denen dieser Fehler auftritt, zusammen mit einigen Empfehlungen, wie der Fehler verringert werden kann.

Bemerkungen

Das gefürchtete und häufig nachgefragte "Fehler 1009: Kein Zugriff auf eine Eigenschaft oder Methode einer Nullobjektreferenz" ist ein Signal, dass einige der Daten als null angezeigt werden, es jedoch versucht wird, als gefülltes Objekt verwendet zu werden. Es gibt ziemlich viele Arten von Problemen, die dieses Verhalten verursachen können, und jeder sollte anhand des Codes getestet werden, an dem der Fehler aufgetreten ist.

Bühne ist nicht verfügbar

Manchmal schreiben Entwickler Code, der Zugriff auf die stage oder Flash-Bühne benötigt, um Listener hinzuzufügen. Es kann zum ersten Mal funktionieren, funktioniert dann aber plötzlich nicht und erzeugt den Fehler 1009. Der fragliche Code kann sogar auf der Timeline stehen, da er die erste Initiative ist, die dort Code hinzufügt, und viele noch vorhandene Tutorials verwendet werden Timeline-Code-Layer zum Platzieren des Codes.

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

Der Grund, warum dieser Code nicht funktioniert, ist einfach: Ein Anzeigeobjekt wird zuerst instanziiert, dann zur Anzeigeliste hinzugefügt, und während es sich außerhalb der Anzeigeliste befindet, ist stage null.

Schlimmer, wenn der Code so lautet:

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

wird auf der Timeline platziert. Es kann sogar einige Zeit funktionieren, während das Main Objekt über die GUI auf die Bühne geklickt wird. Dann wird ihre SWF-Datei von einer anderen SWF-Datei geladen, und plötzlich bricht der Code. Dies ist darauf zurückzuführen, dass die Frames des Main auf eine andere Weise erstellt werden, wenn die SWF-Datei direkt vom Player geladen wird und wenn das Laden asynchron ausgeführt wird. Die Lösung besteht darin, den Event.ADDED_TO_STAGE Listener zu verwenden, den gesamten Code, der adressiert wird, in das Event.ADDED_TO_STAGE und den Listener selbst in eine AS-Datei anstatt in die Timeline aufzunehmen.

Ungültige Typumwandlung

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

Wenn ein solcher Listener an ein Objekt angehängt wird, das kein MovieClip Nachkomme ist (z. B. ein Sprite ), MovieClip fehl und alle nachfolgenden Vorgänge mit ihrem Ergebnis lösen den Fehler 1009 aus.

Unbestätigtes Objekt

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

Hier wird eine Objektreferenz deklariert, aber niemals ein Wert zugewiesen, sei es mit new oder einer Zuweisung eines Nicht-Nullwerts. Das Anfordern seiner Eigenschaften oder Methode führt zu einem Fehler 1009.

Mehrstufiger Ausdruck

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

Hier kann jedes Objekt vor dem Punkt null sein, und die Verwendung von Methoden, die nur komplexe Objekte zurückgeben, erhöht die Komplexität beim Debuggen des Null-Fehlers. Im schlimmsten Fall, wenn die Methode zu externen Fehlern neigt, z. B. das Abrufen von Daten über das Netzwerk.

Unbearbeitetes Funktionsergebnis

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

getChildByName() ist eine der vielen Funktionen, die Null zurückgeben können, wenn bei der Verarbeitung ihrer Eingabe ein Fehler aufgetreten ist. Wenn Sie also ein Objekt von einer Funktion erhalten, die möglicherweise Null zurückgeben kann, überprüfen Sie zuerst, ob es sich um eine Null handelt. Hier wird eine Eigenschaft sofort abgefragt, ohne vorher zu prüfen, ob s null ist. Dadurch wird der Fehler 1009 generiert.

Ereignislistener vergessen

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

In diesem Beispiel wird der childMC (zur Entwurfszeit zu Main hinzugefügt), aber sofort nach dem childMC gotoAndStop() wird eine 1009 gotoAndStop() , wenn der childMC nicht in Frame 2 vorhanden ist. Der Hauptgrund dafür ist der immer dann, wenn ein Abspielkopf durchläuft ein Keyframe (ein Frame, das den Objektsatz des vorherigen Frames nicht erbt), entweder mit gotoAndStop() , gotoAndStop() , wobei der gotoAndPlay() durch einen Keyframe vom aktuellen Frame getrennt wird, oder durch normale Wiedergabe, wenn die SWF- gotoAndPlay() eine ist Animation wird der Inhalt des aktuellen Rahmens zerstört und der neue Inhalt wird mit den Daten erstellt, die in der GUI gespeichert sind. Wenn der neue Frame nicht über ein childMC mit dem Namen childMC , gibt die Eigenschaftsanforderung null zurück, und es wird 1009 childMC .

Dasselbe Prinzip gilt, wenn Sie zwei Ereignis-Listener hinzufügen, aber nur einen entfernen oder einem Objekt einen Listener hinzufügen. Versuchen Sie jedoch, ein anderes Objekt zu entfernen. Der removeEventListener Aufruf warnt Sie nicht, wenn an das Objekt kein entsprechender Ereignis-Listener angehängt ist. Lesen Sie daher den Code, der Ereignis-Listener sorgfältig hinzufügt und entfernt.

Beachten Sie auch: Wenn Sie Timer Objekte verwenden, werden durch Aufrufen von setInterval() und setTimeout() auch Ereignis-Listener erstellt, die ebenfalls ordnungsgemäß gelöscht werden sollten.

Ungültiger Verweis auf ein Frame-basiertes Objekt

Manchmal wird gotoAndStop() in der Mitte des Codes aufgerufen, der auf einige Frame-basierte Eigenschaften verweist. Gleich nachdem der Frame geändert wurde, werden alle Verknüpfungen zu Eigenschaften, die im aktuellen Frame vorhanden waren, für ungültig erklärt. Daher sollte jede Verarbeitung, an der sie beteiligt sind, sofort beendet werden.

Es gibt zwei allgemeine Szenarien für eine solche Verarbeitung: Erstens endet eine Schleife nach dem Aufruf von gotoAndStop() , wie hier:

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

Hier bedeutet ein Fehler 1009, dass der player MC während der Verarbeitung des gotoAndStop() Aufrufs zerstört wurde. Die Schleife wird jedoch fortgesetzt und verweist auf den hitTestObject() -Link, um hitTestObject() . Wenn die Bedingung sagen würde, if (bullet.hitTestObject(player)) stattdessen if (bullet.hitTestObject(player)) , würde der Fehler # 2007 "Parameter hitTestObject darf nicht null sein". Die Lösung ist, eine return Anweisung direkt nach dem Aufruf von gotoAndStop() .

Zweiter Fall sind mehrere Ereignis-Listener für dasselbe Ereignis. So was:

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

Wenn condition() wahr ist, führt der erste Listener gotoAndStop() , der zweite Listener wird jedoch weiterhin ausgeführt, und wenn dieser auf Objekte im Frame verweist, wird ein Fehler von 1009 ausgegeben. Die Lösung besteht darin, mehrere Listener für ein einzelnes Ereignis in einem einzigen Objekt zu vermeiden. Es ist besser, einen Listener zu verwenden, der alle Situationen dieses Ereignisses verarbeitet und ordnungsgemäß beendet werden kann, wenn ein Frame-Wechsel erforderlich ist.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow