У меня есть небольшое финансовое приложение, которое показывает список наблюдения за рыночными данными (текущая цена предложения/текущая цена запроса) в TableView.SimpleDoubleProperty.set (double) throwing NPE
Цены на покупку/заказ обновляются в режиме реального времени для каждого из символов, которые я просматриваю.
Все работает исключительно хорошо, но иногда я получаю исключение NullPointerException при попытке установить либо цену, либо иногда заданную цену.
Вот отрывок из моего графического интерфейса контроллера, который настраивает 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();
Вот что мой сеттер код выглядит следующим образом:
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);
}
}
- Btw - Это не моя обычная привычка ловить мои 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 и на самом деле не знаю, все входы и выходы привязок.
Это происходит, случается спорадически. Другими словами, я еще не могу воспроизвести его нарочно. Это просто случается случайно.
Это похоже на проблему с потоками, но я просто не знаю, почему внутри метода set() есть NPE, поскольку строки в этой таблице не уничтожаются. Когда строки создаются, они всегда навешиваются. Любые советы/мысли оценены.
Этот сеттер работает в потоке событий GUI или в другом потоке? –
Пожалуйста, покажите нам трассировку стека –
@PeterLawrey - сеттер работает в другом потоке. – eak12913