gpt4 book ai didi

java - Bindings.isNotNull 导致空指针异常

转载 作者:行者123 更新时间:2023-11-29 03:28:15 26 4
gpt4 key购买 nike

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

    private final SimpleObjectProperty<ObjectWithColor> colored;

ObjectWithColor类有一个属性 SimpleObjectProperty<Color> ,因此得名。

好吧,现在这个属性有时会指向任何地方;我想做的是有一个 ObjectExpression<Color>返回 colored不为 null 时的颜色,否则为 BLACK。

我在构造函数中写了这段代码:

colored = new SimpleObjectProperty<>();  
ObjectExpression<Color> color= Bindings.when(colored.isNotNull()).then(colored.get().colorProperty()). otherwise(Color.BLACK);

我不明白的是为什么我会在运行该行代码时得到一个NullPointerException。我知道这会被调用,但我不明白为什么。难道不应该只在 colored 不为 null 时才调用它吗?

最佳答案

> 不应该只在 colored 不为 null 时才调用它吗?

没有。让我们用您的代码做一些类比:

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() 时谈论的是 colored is non null。我认为它不是是一个错字,并根据当前的代码片段进行了回答。


编辑:哦!那是个错字!
能够产生问题。正如 javafx.beans.binding.When#then() 的文档所述,此方法返回:

the intermediate result which still requires the otherwise-branch

因此语句 colored.get().colorProperty() 必须是可达的。通常,可绑定(bind)的 if-then-else block 是为以下用途设计的:

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));

或者可以直接在绑定(bind)中使用 ObjectWithColor.colorProperty。

关于java - Bindings.isNotNull 导致空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com