2

下面的代码应该抛出一个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
        }
    }
}

第二,将 BuggyLabel 添加到 Application 并绑定 buggySetter:

<fx:Script>
    <![CDATA[
        [Bindable]
        public var foo:String = 'NULL has no properties';
    ]]>
</fx:Script>

<local:BuggyLabel buggySetter="{foo}"/>

为什么这个应用程序会静默失败?

4

2 回答 2

2

这个问题的答案实际上很简短:这是由 Flex SDK 工程师做出的架构决定。如果您查看 Flex 源代码,您会看到一个try ... catch块吞下了 Binding 中抛出的大多数错误。

Pro:使绑定更容易使用,因为您不必考虑所有可能的错误状态

缺点:调试起来可能会更困难(尽管如果你知道这可能发生并且你有良好的单元测试,你可以将挫败感减少到几乎为零)


我正在谈论的源代码可以mx.binding.Binding在 method 中(在“框架”项目中)找到wrapFunctionCall()。这是相关部分:

    try {
       ...
    }
    catch(error:Error)
    {
        // Certain errors are normal when executing a srcFunc or destFunc,
        // so we swallow them:
        //   Error #1006: Call attempted on an object that is not a function.
        //   Error #1009: null has no properties.
        //   Error #1010: undefined has no properties.
        //   Error #1055: - has no properties.
        //   Error #1069: Property - not found on - and there is no default value
        // We allow any other errors to be thrown.
        if ((error.errorID != 1006) &&
            (error.errorID != 1009) &&
            (error.errorID != 1010) &&
            (error.errorID != 1055) &&
            (error.errorID != 1069))
        {
            throw error;
        }
        else
        {
            if (BindingManager.debugDestinationStrings[destString])
            {
                trace("Binding: destString = " + destString + ", error = " + error);
            }
        }
    }
于 2012-04-24T08:15:12.770 回答
-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 但未创建,这就是为什么它给您上面的错误...您应该创建标签变量或将数据设置为父类

如果...,您的代码可能会起作用

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; 
 }
于 2012-04-24T09:58:30.833 回答