0

ときどき (100 ミリ秒ごとにポイントが追加された 3 分間のプロットで数回) が表示されNullPointerExceptionますが、考えられる原因はわかりません。

java.lang.NullPointerException
    at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.fireDataChange(CircularBufferDataProvider.java:474)
    at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.addSample(CircularBufferDataProvider.java:155)
    at myProject.XYGraphTransfer.addPoint(XYGraphTransfer.java:432)

これがコードサンプルです。

trace1Provider = new CircularBufferDataProvider(true);
trace1Provider.setBufferSize(XYGraphTransfer.Graph_BufferEntries);
trace1Provider.setUpdateDelay(100);
Trace trace1 = new Trace("Time Plot", xyGraph.primaryXAxis, xyGraph.primaryYAxis, trace1Provider);
...
Long timeCurrent = Calendar.getInstance().getTimeInMillis();
Sample oSample = new Sample(timeCurrent, valueBase);
trace1Provider.addSample(oSample);

例外は常にtrace1Provider.addSample(oSample)行にあります。

oSampleになることはあり得ないのでnull、その可能性はありません。

手がかりは実際のエラー行です。

at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.fireDataChange(CircularBufferDataProvider.java:474)

fire the source forはあまり語らないので、それはあまり役に立ちませんfireDataChange()。このinnerUpdate()関数は、ダーティ フラグを設定するだけです。クラッシュはflagDataChange()他の場所ではなく内部にあるため、実際にダウンストリームの原因はありません。他の 2 つの呼び出し と は、fireUpdate()ある程度super.fireDataChange()排除できます。これは、FireUpdate()またはその下流のメソッドが原因である場合、Eclipse はクラスではなくその関数に言及するfireDataChange()ためCircularBufferDataProviderです。

@Override
protected synchronized void fireDataChange()
{
    if (updateDelay > 0)
    {
        innerUpdate();
        if (!duringDelay)
        {
            Display.getCurrent().timerExec(updateDelay, fireUpdate);
            duringDelay = true;
        }
    } else
        super.fireDataChange();
}

@Override
protected void innerUpdate()
{
    dataRangedirty = true;
}

私の考えはある種の競合ですが、グラフにポイントを追加する関数は 1 つしかなく、それはアプリケーション スレッドにあります。グラフはアプリケーション スレッドにも存在します。

更新: 完全なスタック トレース。

java.lang.NullPointerException
    at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.fireDataChange(CircularBufferDataProvider.java:474)
    at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.addSample(CircularBufferDataProvider.java:155)
    at prjNetAccelerator.XYGraphTransfer.addPoint(XYGraphTransfer.java:432)
    at prjNetAccelerator.AppGraphTransfer.addPoint(AppGraphTransfer.java:283)
    at prjNetAccelerator.AppGraphTransfer.pushPoint(AppGraphTransfer.java:187)
    at prjNetAccelerator.HtsLink.getStatusGui(HtsLink.java:456)
    at prjNetAccelerator.HtsLink.getStatusBasic(HtsLink.java:568)
    at prjNetAccelerator.ToolsTreeFolders.fetchFiles(ToolsTreeFolders.java:1351)
    at prjNetAccelerator.TimerFilesFetch.run(TimerFilesFetch.java:81)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

考え?

4

2 に答える 2

1

別の Observer クラスから dataprovider を更新しようとしているときに、現在のバージョン (2.1.0.201808161734) でも同じ問題に遭遇しました。私にとってうまくいったのは、ウィジェットがあるコンポジットからディスプレイを取得し、asyncExec で timerExec をラップすることです。

MyCircularBufferDataProvider extends AbstractDataProvider {...

    @Override
    protected synchronized void fireDataChange() {
        if (updateDelay > 0) {
            if (!duringDelay) {
                parentComposite.getDisplay().asyncExec(
                        ()-> parentComposite.getDisplay().timerExec(updateDelay, fireUpdate));
                duringDelay = true;
            }
        } else
            super.fireDataChange();
    }
}
于 2018-09-23T22:22:24.587 に答える