flex / actionscript分配失败?

时间:2010-05-21 03:37:03

标签: flex actionscript-3 actionscript null flexbuilder

我在动作脚本代码中看到了一些奇怪的东西

我有两个类foo和bar,bar extends foo。在模型类中,我有一个foo成员变量,我将一个bar对象分配给foo变量。但是在赋值之后,foo变量为null。

[Bindable] public var f:foo;
public function someFunc(arr:ArrayCollection):void  {  
  if(arr.length > 0) {
    var tempBar:bar = arr.getItemAt(0) as bar;
    if(tempBar != null) {
      tempBar.someProp++;
      f = tempBar;
      // f is now null
    }
  }
}

关于我可能做错的任何想法?

修改的 这是确切的代码:

  [Bindable] public var selectedCustomerJob:IDSCustomer;

  public function selectedJobByIdCallback(evt:Event):void
  {
   var temp:IDSDTOArrayCollection = evt.currentTarget as IDSDTOArrayCollection;
   if(null != temp && temp.length > 0)
   {
    selectedCustomerJob = IDSJob(temp.getItemAt(0));;
    trace("    selectedCustomerJob: " + flash.utils.getQualifiedClassName(selectedCustomerJob));
    trace("       jobToSelect type: " + flash.utils.getQualifiedClassName(temp.getItemAt(0)));
    trace("jobToSelect super class: " + flash.utils.getQualifiedSuperclassName(temp.getItemAt(0)));
   }
  }

这是跟踪输出:

selectedCustomerJob:null

jobToSelect类型:com.intuit.sb.cdm.v2 :: IDSJob

jobToSelect超类:com.intuit.sb.cdm.v2 :: IDSCustomer

1 个答案:

答案 0 :(得分:0)

使用as关键字进行投射会在失败时返回null。在这种情况下,数组集合中的第一项可能不是您期望的Bar类型的对象;它可能是Foo或其他东西。您可以将子类对象转换为基类,但不能转换为其他方式。

使用括号语法进行强制转换 - 如果强制转换失败,它将抛出异常,因此您可以找出arr.getItemAt(0)的类型。

//Change 
var tempBar:Bar = arr.getItemAt(0) as Bar;

//to 
var tempBar:Bar = Bar(arr.getItemAt(0));

确保数组集合中的第一项确实是Bar实例(而不是Foo或其他内容)。

否则您可以使用

找到类型
trace(flash.utils.getQualifiedClassName(arr.getItemAt(0)));

if(tempBar != null) {
  tempBar.someProp++;
  f = tempBar;
  // f is now null
}

顺便说一下,我认为发布的代码不是您运行的确切代码,因为fnulltempBar应该是null,因为您指定它到f。在这种情况下,if中的代码不应该在您null内检查if时执行。即使它进入if块,它也会在您尝试增加tempBar.someProp的第一行中抛出空指针错误(#1009)