首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CircularBufferDataProvider addSample NullPointerException

CircularBufferDataProvider addSample NullPointerException
EN

Stack Overflow用户
提问于 2015-10-24 05:13:34
回答 2查看 100关注 0票数 0

我有时(在每100ms左右添加点数的3分钟图上有几次)收到NullPointerException,但我看不到任何可能的原因。

代码语言:javascript
复制
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)

以下是代码示例。

代码语言:javascript
复制
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,所以这种可能性是不存在的。

线索是实际的错误行,

代码语言:javascript
复制
at org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider.fireDataChange(CircularBufferDataProvider.java:474)

这对我没有多大帮助,因为触发fireDataChange()source并没有太多意义。innerUpdate()函数仅设置一个脏标志。由于崩溃发生在flagDataChange(),而不是其他地方,因此没有真正的下游原因。另外两个调用,fireUpdate()super.fireDataChange(),可以消除,因为如果原因是FireUpdate()或其下游的方法,那么Eclipse将在CircularBufferDataProvider类中提到该函数,而不是fireDataChange()

代码语言:javascript
复制
@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;
}

我的想法是某种争用,但只有一个函数可以将点添加到图形中,那就是在应用程序线程中。图形也存在于应用程序线程中。

更新:全栈跟踪。

代码语言:javascript
复制
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)

有什么想法?

EN

回答 2

Stack Overflow用户

发布于 2015-10-24 07:49:37

@AndyTurner关于显示器是问题的说法是对的。

我将代码更改为以下代码,运行了相当多的测试,从而避免了异常。

代码语言:javascript
复制
if (null != Display.getCurrent())
    trace1Provider.addSample(oSample);

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-24 06:22:25

在尝试从单独的观察者类更新dataprovider时,我也遇到了当前版本(2.1.0.201808161734)的相同问题。我的工作是从小部件所在的组合中获得显示,并将timerExec包装在asyncExec中:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33311488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档