玩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啦!!!!

相关文章:

  • 2021-08-04
  • 2021-12-04
  • 2021-08-28
  • 2022-12-23
  • 2022-12-23
  • 2021-05-21
  • 2021-08-01
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-09
  • 2022-01-25
  • 2021-05-20
相关资源
相似解决方案