为什么MXML数据绑定会吞下TypeErrors?

时间:2012-04-24 07:24:23

标签: flex data-binding

以下代码抛出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}"/>

为什么这个应用程序会无声地失败?

2 个答案:

答案 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; 
 }