2012-04-24 4 views
2

次のコードは、Error #1009: Cannot access a property or method of a null object referenceを投げるshoud:この奇妙な現象を再現するMXMLデータバインディングがTypeErrorsを呑み込むのはなぜですか?

public function set buggySetter(value:String):void { 
    var label:Label; 
    label.text = value; //will fail silently 
} 

を、:それはバインディングMXMLデータによって設定されたセッターの内側かどう

var label:Label; 
label.text = value; 

はしかし、それはしていませんまず、拡張sが単純なカスタムコンポーネントを作成します。レーベル:

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は、アプリケーションとバインドbuggにBuggyLabelを追加ySetter:

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

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

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

答えて

2

実際のところ、この質問に対する答えは、Flex SDKエンジニアによるアーキテクチャ上の決定です。 Flexのソースコードを見ると、try ... catchブロックがBindingにスローされたほとんどのエラーを飲み込むのを見るでしょう。

プロ:あなたはすべての可能な障害が発生した状態を説明するために持っていないので、それが簡単に、バインディングを使用できるようになり

コン:あなたが知っていれば、この現象が発生することができても(デバッグが難しくなることができますそして、あなたが方法wrapFunctionCall()で)私が話していたソースコードは、「フレームワーク」プロジェクトに(mx.binding.Bindingで見つけることができます


)はほぼゼロにその側からの不満を減らすことができ、良いユニットテストを持っています。ここでは、関連する部分があります:

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); 
      } 
     } 
    } 
+0

1 ...場合は、あなたのコードは、仕事かもしれません。これは正しいことであり、ほとんどの場合、実際にこれが起こることを望んでいます。バインディングの性質は、(キー:最終的に)が来るときに変化を検出することです。私たちの大多数は、Viewと一緒にバインディングを設定しています。そして、データを保持するメディエータやモデルで一度割り当てられた実際の作業を行うことを期待しています。バインディングがこれをしなかったならば、私たちはボイラープレート延期方法の束を書かなければならなくなりました - これにより、私たちのコードはもっと手続き的になりました。 –

+0

しかし、普通のユースケースを処理するために例外を使用するのはひどい考えです。エラーだけのすべてのインスタンスを作成するオーバーヘッドは私を震えます。 – DuneCat

-2

このエラー#1009は、ここにあなたが作成されていないlableにテキストを設定している

あなたのセッターで
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; 
} 
+0

私は意図的にラベルを初期化していない – hidarikani

+0

私はそれが動作するとは思わない... –

関連する問題