0

TableView でマーケット データ ウォッチ リスト (現在のビッド価格/現在のアスク価格) を表示する小さな金融アプリケーションがあります。

ビッド/アスク価格は、私が見ているシンボルごとにリアルタイムで更新されています。

すべてが非常にうまく機能しますが、ビッドまたはアスク価格を設定しようとすると、NullPointerException が発生することがあります。

これは、TableView と列を設定する GUI コントローラーのスニペットです。

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);
    }
}
  • ところで - 私の 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 がある理由がわかりません。行が作成されると、行は永遠に残ります。アドバイス/考えをいただければ幸いです。

4

2 に答える 2

0

それがまだ関連しているかどうかはわかりませんが、アプリで同じことに遭遇したばかりで、答えはピーター・ローリーが言ったとおりでした-Platform.runLater()を使用してイベントスレッドでのみsetメソッドを呼び出します

于 2013-12-10T11:39:25.437 に答える