2015-10-23 2 views
0

J'ai parfois (quelques fois sur une parcelle qui s'étend de 3 minutes avec des points ajoutés toutes les 100ms environ) recevoir un NullPointerException, mais je ne vois aucune cause possible.CircularBufferDataProvider addSample 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) 

Voici l'exemple de code.

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); 

L'exception est toujours sur la ligne trace1Provider.addSample(oSample).

oSample ne peut jamais être null, de sorte que cette possibilité soit désactivée.

Un indice est la ligne d'erreur réelle,

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

Cela ne me permet pas beaucoup, parce que le feu de la source pour fireDataChange() ne dit pas grand-chose. La fonction innerUpdate(), définit simplement un drapeau sale. Comme le crash est en flagDataChange() et pas ailleurs, il n'y a pas vraiment de cause en aval. Les deux autres appels, fireUpdate() et super.fireDataChange(), on peut en quelque sorte éliminer, car si FireUpdate() ou une méthode en aval de cela était la cause, alors Eclipse mentionnerait cette fonction, pas fireDataChange() dans la classe CircularBufferDataProvider. Ma pensée est une sorte de contention, mais il n'y a qu'une seule fonction qui ajoute des points au graphique et qui est dans le thread d'application. Le graphique existe aussi sur le thread d'application.

MISE À JOUR: Trace de pile complète.

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) 

Pensées?

+2

'Display.getCurrent()' - peut-il jamais retourner une valeur nulle? par exemple, de manière transitoire, si l'affichage change? –

+2

Cela pourrait-il être pertinent? https://wiki.eclipse.org/FAQ_How_do_I_get_a_Display_instance%3F –

+0

@AndyTurner C'est une bonne idée. J'ai vu cela et immédiatement rejeté Display.getCurrent() retournant NULL, mais vous avez raison. Quoi d'autre? Je pensais comment est-il possible que l'affichage actuel retourne jamais nul. J'effectuerais un changement dans ce code pour mettre un test, mais Nebula ne m'appartient pas. –

Répondre

1

@AndyTurner avait raison à propos de l'affichage étant le problème.

J'ai changé le code à ce qui suit, a exécuté un certain nombre de tests, et cela a empêché les exceptions.

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

Je devrai étudier le problème d'affichage nul.

+0

'Display.getCurrent()' renvoie null sur chaque thread sauf le thread d'interface utilisateur. Utilisez 'Display.getDefault()' pour obtenir l'affichage sur n'importe quel thread. –

+0

Merci. J'ai appris quelque chose, mais le bug est dans le code de la nébuleuse. L'équipe de développement a codé cette fonction SANS faire une vérification pour null et sans utiliser l'affichage.getDefault(), créant ainsi une exception de pointeur NULL. Le correctif doit être dans leur code, sinon les autres en souffriront. –

+0

Il semblerait qu'il soit prévu que 'CircularBufferDataProvider.addSample' ne soit appelé qu'à partir du thread de l'interface utilisateur et que vous l'appeliez à partir d'un thread de minuteur. Vous pouvez renvoyer l'appel dans un fichier exécutable 'Display.getDefault(). SyncExec' afin qu'il s'exécute dans le thread d'interface utilisateur. –