ActionScript3.0 - Error #1009: 無法存取 Null 物件參考的屬性或方法。

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





2012.4.13
一些遊戲時常會用到 大廳去外載遊戲進來 , 或是不論何種情況一個載體去外載swf
時常會出現一些 , 莫名的錯誤 導致載體無法正常運作 , 程式碼中斷的情況


因為載體去外載外部swf 時 , 會先載入 外部swf 的 宣告 , 接著才去載 內容(MovieClip )
仔細發現 順序似乎錯了 , 應該是 先載內容 -> 宣告 (程式) , 否則就會發生 1009 null物件 情況

解決辦法 , 如果你有以上情況 , 在製作結構時要注意 ,     把程式碼往後推一個影格    
讓場上實體物件 先載入內容 , 才去做宣告



2010.5.12

最近在替幾位網友製作一些範例時發現, 當不斷監聽下去判斷超過一個以上 IF 條件 ,此時判斷結果又跳影格

就會產生 #1009: 無法存取 Null 物件參考的屬性或方法。


如下:

if (判斷式內容1) {

假設成立  gotoAndStop();

}

if (判斷式內容2) {

假設成立  gotoAndStop();

}



#1009: 無法存取 Null 物件,本身的意義是 因為你在原影格內寫了 listener ,當你(跳)換影格時, listener不到物件內容,

導致產生錯誤. 如果listener 只是一次 那倒沒有問題 因為它只listener一次,



如果是持續不斷像是  addEventListener(Event.ENTER_FRAME   這種東西 , 那麼你的錯誤訊息就會一直跑出來煩你

因為 當你寫這段監聽時,記憶體已載入占用, 只要你一天不移除 它就會一直keep work.





所以有解決方法有兩種:



1. 在條件式 IF下 remove 掉listener ,當判斷跳影格時 ,記憶體釋放 不再listener.

    請注意當你code,有很多個listener時 記得都要 移除掉.



if (判斷式內容1) {

假設成立  gotoAndStop();

removeEventListener(Event.ENTER_FRAME,  ); //記得在判斷式完後remove

}

if (判斷式內容2) {

假設成立  gotoAndStop();

removeEventListener(Event.ENTER_FRAME,  );

}



2. 第二種方法, 非常簡單,既然你跳影格會出問題,那就不要跳了 ,乾脆直接把 code 寫在 要操作內容的上一層去遙控


if (判斷式內容1) {

_mc. gotoAndStop(); //對_mc內容做操作 語法影格並不會受影響 此時就算不remove也不會產生錯誤

}





但是請保持良好習慣, 當你有一天EventListener 越來越多時 , 效能就會降低 , ,

所以不用的listener 就將它從記憶體中移除.

沒有留言:

張貼留言