2013-06-14 2 views
0

У меня есть небольшое финансовое приложение, которое показывает список наблюдения за рыночными данными (текущая цена предложения/текущая цена запроса) в 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, поскольку строки в этой таблице не уничтожаются. Когда строки создаются, они всегда навешиваются. Любые советы/мысли оценены.

+1

Этот сеттер работает в потоке событий GUI или в другом потоке? –

+2

Пожалуйста, покажите нам трассировку стека –

+0

@PeterLawrey - сеттер работает в другом потоке. – eak12913

ответ

0

Когда я вижу фрагмент кода ... использовать

new SimpleDoubleProperty() 

и вы никогда не установить компонент и имя собственности для установки. Я предполагаю, что он действительно вызывает NullPointerException, но не из-за значения (Double -> double casting), а потому, что вы не задали имя компонента или свойства.

+0

Странно, что код выполняется тысячи раз и в порядке. Может быть, раз в несколько недель этот NPE случается. – eak12913

+0

Вы проверили свой класс DataChannel, поскольку он показывает трассировку стека? –

0

Не уверен, что, если она по-прежнему актуальна, но я только что столкнулся с той же вещи в моем приложении, и ответ был, как сказал Питер lawrey - вызов метода набора только на потоке событий с Platform.runLater()

Смежные вопросы