有时(在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显示问题。