2

次のコードは:をスローする必要がありError #1009: Cannot access a property or method of a null object referenceます:

var label:Label;
label.text = value;

ただし、MXMLデータバインディングによって設定されたセッターの内部にある場合はそうではありません。

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}"/>

このアプリが黙って失敗するのはなぜですか?

4

2 に答える 2

2

この質問への答えは、実際にはかなり短く、Flex SDK エンジニアによるアーキテクチャ上の決定です。Flex のソース コードを見るtry ... catchと、Binding でスローされたほとんどのエラーをブロックが飲み込んでいることがわかります。

長所: 起こりうるすべての障害状態を考慮する必要がないため、バインディングの使用が容易になります。

短所:デバッグが難しくなる可能性があります(ただし、これが発生する可能性があり、適切な単体テストがある場合は、その側からのフラストレーションをほぼゼロに減らすことができます)


私が話していたソース コードは、mx.binding.Binding(「フレームワーク」プロジェクト内の) メソッド内にあり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 に答える