>それは、colored が null でない場合にのみ呼び出されるべきではありませんか?
いいえ。あなたのコードでいくつかの類推をしましょう:
SimpleObjectProperty<ObjectWithColor> colored = new SimpleObjectProperty<>();
colored.get().colorProperty();
およびその派生クラスはすべてラッパー クラスであるため、Property
fullName フィールドを文字列として (ラップ) 持つ Person クラスと考えることができます。したがって、上記の類推は次のとおりです。
Person person = new Person();
person.getFullName().toString();
getFullName() は null を返すため、getFullName().toString() で NullPointerException が発生します。
両方の比較について、仮定は次のとおりです。ラップされたフィールドにデフォルト値がないか、デフォルト コンストラクターで初期化されていません。
この仮定を続けましょう。この場合、
コンストラクターを介して値を初期化することにより、NullPointerException を回避できます。
Person person = new Person("initial full name");
person.getFullName().toString();
または呼び出しセッター:
Person person = new Person();
person.setFullName("Foo Bar");
person.getFullName().toString();
同じことがあなたのコードにも当てはまります:
SimpleObjectProperty<ObjectWithColor> colored =
new SimpleObjectProperty<>(new ObjectWithColor(Color.RED));
colored.get().colorProperty();
また
SimpleObjectProperty<ObjectWithColor> colored = new SimpleObjectProperty<>();
colored.set(new ObjectWithColor(Color.RED));
colored.get().colorProperty();
あなたの質問を正しく理解できたことを願っています。それにもかかわらず、一方で、「それは色付きが null でない場合にのみ呼び出されるべきではありませんか?」プロンプト、実際に をチェックしているときに、色付きが null でないことについて話しているlastSupplier.isNotNull()
。タイプミスではないと推測し、現在のコードに基づいて回答しました。
編集:ああ!それはタイプミスでした!
問題を生成できました。
javafx.beans.binding.When#then()
言及のドキュメントとして、このメソッドは以下を返します。
the intermediate result which still requires the otherwise-branch
したがって、ステートメントcolored.get().colorProperty()
は到達可能でなければなりません。通常、バインド可能な if-then-else ブロックは、次のような用途向けに設計されています。
SimpleObjectProperty<Double> doubleProperty = new SimpleObjectProperty();
ObjectExpression<Double> expression = Bindings.when(doubleProperty.isNotNull()).then(doubleProperty).otherwise(-1.0);
System.out.println(doubleProperty.getValue() + " " + doubleProperty.isNotNull().getValue() + " " + expression.getValue());
doubleProperty.setValue(1.0);
System.out.println(doubleProperty.getValue() + " " + doubleProperty.isNotNull().getValue() + " " + expression.getValue());
出力:
null false -1.0
1.0 true 1.0
その結果、初期のデフォルト値を定義できます。
SimpleObjectProperty<ObjectWithColor> colored = new SimpleObjectProperty(new ObjectWithColor(Color.BLACK));
または、バインディングで ObjectWithColor.colorProperty を直接使用することもできます。