我有一个简单的字段(确实是一个属性):
private final SimpleObjectProperty<ObjectWithColor> colored;
ObjectWithColor
类有一个属性SimpleObjectProperty<Color>
,因此名称。
好的,现在这个属性有时无处可寻;我想做的是让ObjectExpression<Color>
在非空时返回colored
的颜色,否则返回BLACK。
我在构造函数中编写了这段代码:
colored = new SimpleObjectProperty<>();
ObjectExpression<Color> color= Bindings.when(colored.isNotNull()).then(colored.get().colorProperty()). otherwise(Color.BLACK);
我不明白为什么我会运行 NullPointerException 来运行该行代码。我明白被召唤,但我不明白为什么。只有当着色为非空时才应该调用它吗?
答案 0 :(得分:4)
&GT;只有当着色为非空时才应该调用它吗?
没有。让我们对你的代码做一些类比:
SimpleObjectProperty<ObjectWithColor> colored = new SimpleObjectProperty<>();
colored.get().colorProperty();
由于Property
及其派生类都是包装类,因此可以将其视为具有(包装)fullName字段为String的Person类。所以上面的比喻:
Person person = new Person();
person.getFullName().toString();
我们在getFullName()。toString()得到NullPointerException,因为getFullName()返回null。
对于这两种比较,假设是;包装字段没有默认值,也没有在默认构造函数中初始化。
让我们继续这个假设。在这种情况下,我们可以避免使用NullPointerException 通过构造函数初始化值:
Person person = new Person("initial full name");
person.getFullName().toString();
或致电setter:
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();
我希望我能正确理解你的问题。然而,另一方面,在“只有在有色的时候不应该被称为非空?”提示,当你实际检查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。