一定都會碰到這個錯誤:
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這兩個事件有啥不同勒?
我整理一下!
顯示物件的「舞台」。 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啦!!!!