Bindings.isNotNull导致空指针异常

时间:2013-11-07 23:06:19

标签: java binding javafx

我有一个简单的字段(确实是一个属性):

    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 来运行该行代码。我明白被召唤,但我不明白为什么。只有当着色为非空时才应该调用它吗?

1 个答案:

答案 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。