SimpleDoubleProperty.set(double) throwing NPE



我有一个小的金融应用程序,它在TableView中显示市场数据观察列表(当前买入价/当前卖出价)

我正在观察的每个股票的买入价/卖出价都在实时更新。

一切都工作得非常好,但偶尔我得到一个NullPointerException当试图设置出价或有时卖出价。

这是一个片段,从我的GUI控制器设置TableView和Columns

TableColumn<PositionRowData, Number> bidColumn = new TableColumn<PositionRowData, Number>(BID_COLUMN_NAME);
TableColumn<PositionRowData, Number> askColumn = new TableColumn<PositionRowData, Number>(ASK_COLUMN_NAME);
TableColumn<PositionRowData, Number> lastColumn = new TableColumn<PositionRowData,Number>(LAST_COLUMN_NAME);
.
.
.
   //and later on the column is initialized like this
bidColumn.setCellFactory(new USDTableCellRenderer());
bidColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<PositionRowData,Number>, ObservableValue<Number>>() {
        @Override
        public ObservableValue<Number> call(
                CellDataFeatures<PositionRowData, Number> arg0) {
            return arg0.getValue().getBid();
        }
   });
//finally the columns are added to the table
TableView.getColumns().addAll(....bidColumn..etc);

下面是PositionRowData构造函数的一个片段,初始化:

bid = new SimpleDoubleProperty();
ask = new SimpleDoubleProperty();

我的setter代码是这样的:

public void setBid(double bid) {
    try {
        this.bid.set(bid);
    } catch (NullPointerException e) {
        _log.error("Would have been NPE in setBid. trying to set new value: "+bid);
    }
}
    顺便说一句,这不是我通常的习惯去捕捉我的npe !我只是把它放在那里,因为我想让为我测试这个的人看到一个更优雅的错误!
下面是完整的堆栈跟踪:
2013-06-20 11:56:12,500 ERROR [DataChannel Reader Thread] - NPE
java.lang.NullPointerException
at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(Unknown Source)
at javafx.beans.property.DoublePropertyBase.fireValueChangedEvent(Unknown Source)
at javafx.beans.property.DoublePropertyBase.markInvalid(Unknown Source)
at javafx.beans.property.DoublePropertyBase.set(Unknown Source)
at com.eak070.ui.tablemodel.PositionRowData.setAsk(PositionRowData.java:86)
at com.eak070.ui.ETGUIController.onQuote(ETGUIController.java:808)
at com.eak070.ui.ETGUIController$24.handleDataChannelMessage(ETGUIController.java:737)
at com.eak070.communication.stream.DataChannel.processDataChannelMessage(DataChannel.java:211)
at com.eak070.communication.stream.DataChannel.readFromSocketChannel(DataChannel.java:156)
at com.eak070.communication.stream.DataChannel.access$1(DataChannel.java:122)
at com.eak070.communication.stream.DataChannel$1.run(DataChannel.java:99)

我不太确定发生了什么,因为我对JavaFX还是有点陌生,不太了解绑定的来龙外径。

这似乎是偶尔发生的。换句话说,我还不能故意复制它。这似乎是随机发生的。

这感觉就像它可能是一个线程问题,但我只是不确定为什么有一个NPE内部的set()方法,因为在这个表中的行没有被销毁。一旦行被创建,它们就会永远存在。如有任何建议或想法,欢迎。

当我看到你的代码片段…使用

new SimpleDoubleProperty() 

,并且您永远不会设置bean和要设置的属性名称。我猜它真的调用NullPointerException,但不是因为值(Double -> Double casting),而是因为你没有设置bean或属性名称。

不确定它是否仍然相关,但我刚刚在我的应用程序中遇到了同样的事情,答案是peter lawrey说-仅在事件线程上使用Platform.runLater()

调用set方法

最新更新