2012-07-29 176 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的调用,如果数据存在,它不会被一个空白的对象覆盖。

相关问题