Schnelltipp So debuggen Sie einen AS3-Fehler Nr. 1120

Ein sehr häufiger ActionScript-Fehler ist der Fehler "undefined property", Fehler 1120. In der Tat kann dies der häufigste Fehler bei der Kompilierung sein. Ihre Ursache ist sehr einfach, aber es gibt eine Reihe von Möglichkeiten, wie sie tatsächlich induziert werden kann. Wir werden einen kurzen Überblick über einige der Szenarien geben, in denen Sie auf diesen Fehler stoßen, und wie Sie diese beheben können.


Die Erklärung

Lassen Sie uns zunächst einen Überblick darüber bekommen, was mit diesem Fehler los ist. Dies wird unsere theoretische Diskussion sein; Weitere praktische Beispiele finden Sie im Rest des Tipps.

Dieser Fehler tritt auf, wenn Sie in einer Codezeile auf eine Variable (oder Eigenschaft) verweisen, die jedoch nicht vorhanden ist. Wenn Sie es gewohnt sind, ActionScript im Skriptbedienfeld zu schreiben, und nicht in Klassen, dann lassen Sie sich nicht vom Begriff "Eigenschaft" abschrecken. Ich werde nicht zu einer ausführlichen Diskussion über die Gründe für diese beiden Begriffe kommen, aber es genügt zu sagen, dass angesichts der Art und Weise, wie ActionScript Code aus dem Skriptbedienfeld kompiliert, eine Variable tatsächlich eine Eigenschaft ist.

Wenn der ActionScript-Compiler die angegebene Eigenschaft nicht finden kann, wird er mit dem Compilerfehler 1120 gekennzeichnet. Sie sehen etwa Folgendes:

 1120: Zugriff auf undefiniertes Grundstück.

Woher "foo"ist der Name Ihres beleidigenden Eigenschaftennamens.

Dies zu lösen, ist in der Regel so einfach wie der richtige Name. Lass uns einen Blick darauf werfen.


Beispiel 1: Keine Variablendeklaration

Nehmen Sie diesen Code zum Beispiel (wenn Sie möchten, können Sie entweder die "fehlt"Beispielprojekt (d. h. das Projekt, das im Quelldownload als" nicht vorhanden "bezeichnet wird) oder dieses Projekt selbst erstellen: Erstellen Sie einfach eine neue Flash-Datei und eine Dokumentenklasse, und fügen Sie diesen Code in die Dokumentenklasse ein:

 Paket import flash.display. *; public class Missing Erweitert Sprite public function Missing () foo = "Moo."; 

Kompilieren Sie diese FLA und Sie erhalten die 1120: Zugriff auf undefiniertes Grundstück. Fehler, gerichtet auf Zeile 7.

Wieder ist die Ursache wahrscheinlich sehr klar; Du hast das nie erklärt foo Eigenschaft und so die Verwendung in Zeile 7, als ob es bereits existierte, verursacht Probleme. Die Lösung besteht darin, die Variable einfach zu deklarieren. Technisch kann dies im geeigneten Umfang überall existieren. Jede der folgenden Lösungen ist akzeptabel:

Deklarieren Sie es als Parameter für die Methode:

 öffentliche Funktion fehlt (foo: String) foo = "Moo."; 

Deklarieren Sie es als lokale Variable innerhalb der Methode:

 öffentliche Funktion Missing () var foo: String; foo = "Moo."; 

Deklarieren Sie es als eine Instanz-Eigenschaft in der Klasse:

 Paket import flash.display. *; public class Fehlende Erweiterungen Sprite private var foo: String; öffentliche Funktion Missing () foo = "Moo."; 

Die Lösung hängt davon ab, was für Sie geeignet ist. Es ist nicht üblich, einen Methodenparameter zu deklarieren und ihn dann einfach im Methodenhauptteil festzulegen, obwohl es Fälle gibt, in denen Sie die Parameterwerte beeinflussen möchten.

Interessant ist die Art und Weise, wie Flash nach einer Variablen des Namens sucht. Zunächst wird nach einer lokalen Variablen des Namens gesucht foo. Wenn einer nicht deklariert wurde, werden die Parameter für diesen Namen geprüft. Wenn es dort keine finden kann, sucht es nach einer Instanzeigenschaft mit demselben Namen. Wenn nichts davon gefunden wird, wird Fehler 1120 angezeigt.


Beispiel 2: Ein Tippfehler

Unser nächstes Beispiel wird ziemlich ähnlich sein. Wieder können Sie einfach die "öffnen"Tippfehler"Projekt aus dem Download; oder erstellen Sie eine einfache FLA mit Dokumentklasse und fügen Sie den folgenden Code in die Klasse ein oder geben Sie ihn einfach ein.

 Paket import flash.display. *; öffentliche Klasse Typo erweitert Sprite var foo: String; öffentliche Funktion Typo () boo = "Moo."; 

Hier ist nicht viel los. Die Idee ist, eine Eigenschaft zu deklarieren foo, und dann im Konstruktor auf den Wert setzen "Muhen.". Das Fleisch davon ist in den Zeilen 5 und 9 (oben hervorgehoben). Der Rest ist nur Dokumentenklasse.

Wieder ist der Fehler wahrscheinlich schmerzlich offensichtlich. Und natürlich, wenn es nur zwei Codezeilen gibt, mit denen Sie sich befassen müssen. Wir haben eindeutig einen Tippfehler. wir wollten schreiben:

 foo = "Moo.";

Wenn Sie den Tippfehler korrigieren, können Sie den FLA ohne den 1120-Fehler kompilieren.

Obwohl dies offensichtlich ist, möchte ich zwei Notizen machen. Die erste ist, dass Tippfehler wie diese etwas häufiger sind und schwieriger zu ermitteln sind, wenn Sie Tausende von Codezeilen in Ihrem Projekt haben. Eine gute IDE oder ein Texteditor können Sie durch die automatische Vervollständigung oder andere Arten der Fehlerprüfung unterstützen. Als fehlersicheres ActionScript-Programm können Sie auch den Fehler 1120 verwenden.

Der zweite Hinweis ist, dass der Fehler, den ActionScript tatsächlich meldet, darin besteht, dass Sie versuchen, auf eine Eigenschaft mit dem Namen "" zu verweisen.booIn diesem Beispiel haben wir den Fehler erzeugt, indem wir einen Tippfehler in unseren Code eingefügt haben. ActionScript weiß jedoch nicht, dass Sie es wirklich meinen.foo"; es geht davon aus, dass wenn Sie schreiben"boo = "Moo.";"das meintest du boo, und warnt Sie, wenn keine Eigenschaft dieses Namens gefunden werden kann.

Dies ist eine eher subtile Unterscheidung, aber es ist hilfreich, die wahre Ursache des Fehlers zu berücksichtigen.


Beispiel 3: Stage Instances deklarieren

Unser letztes Beispiel bezieht sich insbesondere auf die Flash IDE und kann ignoriert werden, wenn Sie Flash CS3 / 4/5 nicht verwenden und stattdessen Flash Builder mit dem Flex Framework verwenden. Das Einrichten des Fehlers erfordert einige einfache Schritte.

Sie finden das problematische Projekt in der Bühneninstanz Ordner des Downloadpakets. Oder Sie können es neu erstellen, indem Sie die folgenden Schritte ausführen:

  1. Beginnen Sie mit einer neuen Flash-Datei und der zugehörigen Dokumentenklasse.
  2. Zeichnen Sie in der Flash-Datei eine Form und verwandeln Sie sie in ein Symbol.
  3. Wählen Sie die Symbolinstanz auf der Bühne aus, öffnen Sie das Eigenschaftenfenster und benennen Sie die Instanz Instanz_MC.
  4. Immer noch in Flash, wählen Sie Datei> Veröffentlichungseinstellungen dann wählen Sie die Blitz Tab.
  5. Klicke auf das Die Einstellungen… neben dem Einblendmenü "Skript:".
  6. Wo ist das? Stage: Bühneninstanzen automatisch deklarieren, Stellen Sie sicher, dass das Kontrollkästchen aktiviert ist unausgewählt.
  7. Fügen Sie der Dokumentklasse den folgenden Code hinzu:

     Paket import flash.display. *; public class StageInstance erweitert Sprite public function StageInstance () instance_mc.rotation = 45; 

An diesem Punkt können Sie den Film laufen lassen. Sie erhalten wieder den 1120-Fehler.

Wie Sie vielleicht ahnen können, hatte das Deaktivieren von "Bühneninstanzen automatisch deklarieren" viel mit der Erzeugung des Fehlers zu tun. Diese Option ist standardmäßig aktiviert, sodass Sie wahrscheinlich einen Grund dafür haben - und sich dessen bewusst sein sollten -, um sie auszuschalten.

Was ist, wenn auch ziemlich selbsterklärend, aber ich füge meine zwei Cents hinzu. Wenn Sie über eine Dokumentklasse (oder eine benutzerdefinierte Klasse, die mit einem Symbol in der Bibliothek verknüpft ist) verfügen, wird diese Klasse erweitert Sprite oder Filmausschnitt. Die typischen Regeln für das Erstellen von Variablen und Eigenschaften gelten für jede andere Klasse. Da Sie jedoch eine visuelle Schnittstelle zu diesem Objekt - die Flash-IDE - haben, können Sie Eigenschaften implizit hinzufügen, indem Sie mehr Symbole auf die Bühne zeichnen und ihnen Instanznamen geben.

Wenn "Bühneninstanzen automatisch deklarieren" aktiviert ist, durchläuft Flash die zur Bühne hinzugefügten Objekte durch die IDE und fügt Eigenschaftsdeklarationen für jede Symbolinstanz mit einem Namen in die entsprechenden Klassen ein.

Wenn es ausgeschaltet ist, macht Flash nichts mit den Instanzen auf der Bühne.

Um den Fehler zu vermeiden, können Sie diese Option einfach wieder aktivieren. Alternativ können Sie die Bühneninstanzen auch manuell deklarieren. Wenn wir unsere Dokumentenklasse so aussehen lassen:

 Paket import flash.display. *; public class StageInstance erweitert Sprite public var instance_mc: MovieClip; öffentliche Funktion StageInstance () instance_mc.rotation = 45; 

Dies würde auch den Fehler vermeiden, da die Eigenschaft noch deklariert ist. es wurde einfach nicht automatisch von Flash Professional deklariert.

Beachten Sie, dass der Zugriffsmodifizierer dies nicht ist Öffentlichkeit Sie erhalten einen Laufzeitfehler. Ich werde nicht näher auf diesen Fehler eingehen. das wird für einen anderen Quick Tip sein.

Warum sollten Sie diese Option überhaupt deaktivieren? Ich denke, die Gründe haben alles damit zu tun, Flash als Entwicklungswerkzeug zu verwenden. Wenn Sie Flash Builder zum Codieren oder ASDoc verwenden oder Flash-Inhalte in ein Flex-Projekt integrieren, werden Sie möglicherweise die Auswirkungen des Deaktivierens der Option zu schätzen wissen. Wenn Sie es deaktivieren, müssen Sie die Eigenschaften dann manuell deklarieren. Das Gegenteil ist auch richtig: Wenn Sie es einschalten, sind Sie dazu gezwungen nicht deklarieren Sie diese Eigenschaften manuell.

Wenn Sie Ihre Klassendateien über ASDoc ausführen, wird sie höchstwahrscheinlich einen Verweis auf eine Stage-Instanz finden, aber nicht ihre Deklaration. Sie erhalten den Fehler 1120. Das Aktivieren der Option ist praktisch, aber das Deaktivieren zwingt Sie mehr "reinen" Code zu schreiben, der tragbarer und in sich geschlossener ist.


Ich erkläre diesen Quick Tip als erledigt

Wie viele Fehler ist der Fehler 1120 im Herzen einfach und kann leicht behoben werden, wenn Sie wissen, wonach er suchen soll. Vielen Dank für das Lesen. Bleiben Sie dran für weitere Debugging-Schnelltipps!