以下代码抛出Error #1009: Cannot access a property or method of a null object reference
:
var label:Label;
label.text = value;
但是,如果它位于由MXML数据绑定设置的setter中,则不会发生:
public function set buggySetter(value:String):void {
var label:Label;
label.text = value; //will fail silently
}
要重现这种奇怪的行为,首先,通过扩展s:Label:
来创建一个简单的自定义组件package {
import spark.components.Label;
public class BuggyLabel extends Label {
public function set buggySetter(value:String):void {
var label:Label;
label.text = value; //will fail silently
}
}
}
Sectond,将BuggyLabel添加到应用程序并绑定buggySetter:
<fx:Script>
<![CDATA[
[Bindable]
public var foo:String = 'NULL has no properties';
]]>
</fx:Script>
<local:BuggyLabel buggySetter="{foo}"/>
为什么这个应用程序会无声地失败?
答案 0 :(得分:2)
这个问题的答案实际上相当短:这是Flex SDK工程师做出的架构决策。如果你看一下Flex源代码,你会看到一个try ... catch
块吞噬了Binding中抛出的大多数错误。
Pro :可以更轻松地使用绑定,因为您不必考虑所有可能的错误状态
Con :它可能更难调试(虽然如果你知道这可能发生并且你有良好的单元测试,你可以减少从那一侧的挫折到接近零)
我在谈论的源代码可以在方法mx.binding.Binding
的{{1}}(在'框架'项目中)中找到。这是相关部分:
wrapFunctionCall()
答案 1 :(得分:-2)
此错误#1009
TypeError: Error #1009: Cannot access a property or method of a null object reference.
在你的二传手中
public function set buggySetter(value:String):void {
var label:Label; // here is the problem
label.text = value; //will fail silently
}
这里你要将文本设置为未创建的标签.... 你只是指定标签var但没有创建,这就是为什么它给你上面的错误... 你应该创建lable varibal或将数据设置为父类
如果...
,您的代码可能会有效public function set buggySetter(value:String):void {
var label:Label = new Lable();
label.text = value; //now it ll work
}
or
public function set buggySetter(value:String):void {
this.text = value;
}