FLASH AS3.0的TypeError: Error #1009: 無法存取 Null 物件參考的屬性或方法

玩AS3.0到一定的程度時!

 

一定都會碰到這個錯誤:

TypeError: Error #1009: 無法存取 Null 物件參考的屬性或方法。


寫完幾百行的程式以後

一輸出顯示出這個錯誤訊息!

我相信各位一定都會有想砸電腦的衝動吧!(這也是AS3.0麻煩的地方!)

來回檢查個幾百次!邏輯都沒問題阿!

就是找不到錯誤!!!

難道就能放任他無解嗎??

 


後來找到原因了!

 

首先我們先來看看Event.ADDED這個事件吧!!

我們都知道任何Display Object(可視物件)被new(建構)出來時

他不會顯示出來!而是存在電腦的記憶體裡面

必須透過addChild()這個方法將可視物件顯示出來

而在使用addChild()加入時

這時就會發生Event.ADDED這個事件!


接下來是Event.ADDED_TO_STAGE這個事件

ADOBE寫的原文說明:
加入至舞台上顯示清單的 DisplayObject(可視物件) 實體,方式為直接加入或

透過加入包含 DisplayObject 實體的子樹狀結構(就是他的子繼承物件)來加入。

如果直接加入 DisplayObject 實體,便會在ADDED_TO_STAGE事件之前發生 ADDED 事件。

 


看了ADDED_TO_STAGE官方說明!相信還是有看沒有懂

意思就是說一個DisplayObject可視物件如果是用addChild()方法加入到

"場景"上,就會發生ADDED_TO_STAGE這個事件!!

那ADDED跟ADDED_TO_STAGE這兩個事件有啥不同勒?

我整理一下!

 

當被使用addChild加入時,會發生 ADDED事件
如果被addChild加入時, 該物件是存在stage之下, 就會同時發生 ADDED與ADDED_TO_STAGE事件(只是ADDED會先發生!)

接下來講一下stage這個類別
下面這是官方的說法!

顯示物件的「舞台」。 Flash 應用程式只有一個 Stage 物件。 例如,您可以建立多個顯示物件並將之載入顯示清單中,如此,每個顯示物件的 stage 屬性都會參照到相同的 Stage 物件 (即使顯示物件屬於載入的 SWF 檔案亦然)。

如果顯示物件未加入顯示清單,它的 stage 屬性便會設為 null。

 

會發生Error #1009的原因在於:

stage屬性, 是可視物件DisplayObject擁有的屬性

就像parent和root屬性一樣,都是唯讀

stage屬性一開始為 null ,一定要可視物件被加入至stage後!

stage屬性才會有值

所以在建構函式時就偵聽stage的話(因為你的可視物件還沒加到場景,上面有說ADDED會發生在ADDED_TO_STAGE之前),就會發生

"Error #1009無法取存null的屬性或方法"

所以我們只要讓stage去偵聽ADDED_TO_STAGE事件!這樣可視物件

就能被加到場景上了(這樣stage就不會是空值了!!)

 

這種錯誤最常發生於A.SWF去載入B.SWF時


以下我們就舉奶綠老師的範例!

 

   
     
package {
import flash.display.MovieClip;
import flash.events.Event;

public class ChildMC extends MovieClip{

public
function ChildMC() {
trace(stage);
// 如果該檔是直被被執行, 沒有被載入的情況 下, stage屬性會有值,
// 如果是被載入, 一開始的stage會是null
// 所以一開始對 stage.addEventListener事件, 就會發生錯誤。

this .addEventListener(Event.ADDED_TO_STAGE , addToStage
Handler);
// 偵聽Event.ADDED_TO_STAGE事件,
// 該事件指的是,當自已被加入場景上時,會觸法該事件
// 因為被加入到場景上, 所以之後的stage屬性就不會是 null

this .addEventListener(Event.REMOVED_FROM_STAGE , removed
FromStageHandler);
// 當該物件被從場景上移除時
}
private
function addToStageHandler(e:Event): void {
// 這兒即可自由的存檔stage屬性
}
private
function removedFromStageHandler(e:Event): void {
// 把所有的事件通通取消掉。
this .removeEventListener(Event.ADDED_TO_STAGE , addToStage
Handler);
this .removeEventListener(Event.REMOVED_FROM_STAGE , remov
edFromStageHandler);
}
}
}

所以,以後最保險的方法就是先讓場景偵聽Event.ADDED_TO_STAGE這個事件!這樣就能保證場景不會是NULL啦!!!!

你可能感兴趣的:(Flash)