我在动作脚本代码中看到了一些奇怪的东西
我有两个类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
答案 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
}
顺便说一下,我认为发布的代码不是您运行的确切代码,因为f
为null
,tempBar
应该是null
,因为您指定它到f
。在这种情况下,if
中的代码不应该在您null
内检查if
时执行。即使它进入if
块,它也会在您尝试增加tempBar.someProp
的第一行中抛出空指针错误(#1009)