我有一个小型金融应用程序,它在TableView中显示市场数据监视列表(当前出价/当前要价)。
正在为我正在观看的每个符号实时更新买/卖价格。
一切都运行得非常好,但在尝试设置出价或有时设置要价时偶尔会出现NullPointerException。
以下是我的GUI控制器中设置TableView和列
的片段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);
}
}
这是完整的堆栈跟踪:
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还有点新手,并且不太了解绑定的细节。
这似乎偶尔会发生。换句话说,我还不能故意重现它。它似乎随机发生。
这感觉它可能是一个线程问题,但我只是不确定为什么在set()方法中有一个NPE,因为这个表中的行没有被销毁。一旦创建了行,它们就会永远存在。任何建议/想法都赞赏。
答案 0 :(得分:0)
当我看到您的代码段时......您使用
new SimpleDoubleProperty()
并且您永远不会设置bean和要设置的属性名称。我猜它确实会调用NullPointerException,但不是因为值(Double - &gt; double casting),而是因为你还没有设置bean或属性名。
答案 1 :(得分:0)
不确定它是否仍然相关,但我刚刚在我的应用程序中遇到了同样的事情,答案就像peter lawrey所说的那样 - 仅在事件线程上使用Platform.runLater()调用set方法