2012-07-29 180 views
0

是的,我確定在SO上有這樣的數百萬個問題,但是這個問題困擾了我。觀察下面的代碼示例:AS3錯誤代碼1009 - 無法訪問空對象引用的屬性或方法

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="init(event)"> 

<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 

     [Bindable] 
     private var data:Object; 

     private function init(e:FlexEvent):void { 
      this.data.item = new Array(); 
     } 
    ]]> 
</fx:Script> 
</s:Group> 

爲什麼我不能創建data對象上的數組item?我認爲Object班被天生宣稱是動態的?這裏是我在運行時得到的錯誤,因爲它:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 

有人可以請幫我弄清楚如何創建我自己的屬性對這個對象。通常這很容易。大聲笑

謝謝你的時間。

回答

3

問題是data尚未實例化,爲空。

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="init(event)"> 

<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 

     [Bindable] 
     private var data:Object; 

     private function init(e:FlexEvent):void { 
      this.data = {}; 
      this.data.item = new Array(); 
     } 
    ]]> 
</fx:Script> 
</s:Group> 
+0

猜猜我今天清醒得太久了。不能相信我錯過了這一點。謝謝。 – 2012-07-29 02:10:56

+0

你想要小心......如果數據已經存在,那麼你會用空對象覆蓋它......這不一定是你想要的。 – 2012-07-29 02:12:55

2

確保首先存在數據。

private function init(e:FlexEvent):void { 
    this.data = {}; 
    this.data.item = new Array(); 
} 
+0

哎呀......我有一個biiiiiigggggg衝「我不敢相信我沒有想到這個」在我看到的時候就跑過來了。是的,就是這樣。謝謝。 ;) – 2012-07-29 02:10:27

0

您正在混淆數據類型和數據實例。所有類都從object派生,但並非所有對象都是動態的。

換句話說,如果數據是不是動態的數據類型,那麼您不能設置item屬性。 AS3中的類與dynamic關鍵字一起定義爲動態。匿名對象默認是動態的:

因此,如果您設置了this.data = {}那麼您將能夠設置item屬性。

2

更妙的是,你可以這樣做:

private function init(e:FlexEvent):void { 
    if(this.data == null) 
     this.data = {}; 
    this.data.item = new Array(); 
} 

這樣一來,每當init的調用,如果數據存在,它不會被一個空白的對象覆蓋。

相關問題