有时(在3分钟的情节中,很少有时间每100ms左右添加点)收到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)


这对我没有太大帮助,因为将source换为fireDataChange()并不能说太多。 innerUpdate()函数仅设置脏标志。由于崩溃发生在flagDataChange()而不是其他位置,因此没有真正的下游原因。其他两个调用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;
}


我的想法是某种争执,但是只有一个函数可以在图形中添加点并且位于应用程序线程中。该图也存在于应用程序线程中。

更新:
完整的堆栈跟踪。

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)


有什么想法吗?

最佳答案

@AndyTurner是正确的关于显示是问题。

我将代码更改为以下代码,运行了许多测试,从而防止了异常。

if (null != Display.getCurrent())
    trace1Provider.addSample(oSample);


我将不得不调查null显示问题。

10-05 18:48