2014-07-06 5 views
1

J'ajoute quelques éléments à ObservableList dans JavaFX et après avoir ajouté quelques éléments je commence à obtenir NullPointerException pour tous les articles que j'ajoute. Selon le JavaDoc la méthode add() jette NullPointerException lorsque:ObservableList jetant NullPointerException

NullPointerException - si l'élément spécifié est nul et cette liste ne permet pas d'éléments nuls

Mais comme vous pouvez le voir alors que je suis débogage mon élément est non nul:

enter image description here

Alors, pourquoi je reçois ce NullPointerException?

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
    at javafx.scene.chart.XYChart$Series$1.onChanged(XYChart.java:1525) 
    at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:158) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:72) 
    at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233) 
    at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) 
    at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) 
    at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205) 
    at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155) 
    at java.util.AbstractList.add(AbstractList.java:108) 
    at sample.Main$1.handle(Main.java:115) 
    at javafx.animation.AnimationTimer$AnimationTimerReceiver$1.run(AnimationTimer.java:58) 
    at javafx.animation.AnimationTimer$AnimationTimerReceiver$1.run(AnimationTimer.java:56) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javafx.animation.AnimationTimer$AnimationTimerReceiver.handle(AnimationTimer.java:56) 
    at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:359) 
    at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:269) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:475) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460) 
    at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 
    at java.lang.Thread.run(Thread.java:745) 

Où est sample.Main$1.handle(Main.java:115) où j'utilise la méthode add().

EDIT:

Il semble qu'il ne se produit que lorsque j'ajouter les articles à l'intérieur des choses comme TimerTask() ou AnimationTimer():

new AnimationTimer(){ 
      @Override 
      public void handle(long now) { 
       for (XYChart.Data<Double, Double> data : fullDataQueue){ 
        chartData.add(data); 
       } 
      } 
     }.start(); 

Sinon, je ne reçois pas ce expection!

EDIT 2:

Ok je pense que je sais ce que le problème est, voici le code de test:

@Test 
    public void testSeriesAddInAnimator(){ 
     // Data 
     XYChart.Series<Double, Double> series = new XYChart.Series<>(); 
     ConcurrentLinkedQueue<XYChart.Data<Double, Double>> fullDataQueue = new ConcurrentLinkedQueue<>(); 
     ObservableList<XYChart.Data<Double, Double>> chartData = FXCollections.observableArrayList(); 

     series.setData(chartData); 

     // Start adding data 
     final Random random = new Random(); 
     for(int n = 0; n < 10000; ++n){ 
      fullDataQueue.add(new XYChart.Data<>((double)n, random.nextDouble())); 
     } 

     new AnimationTimer(){ 
      @Override 
      public void handle(long now) { 
       for (XYChart.Data<Double, Double> data : fullDataQueue){ 
        chartData.add(data); 
       } 
       System.out.println("Stop!"); 
       //stop(); -> Uncomment this and we get no exception! 
      } 
     }.start(); 
     System.out.println("Done testSeriesAddInAnimator()!"); 
    } 

Cela semble faire si j'ajouter à nouveau les données existantes dans la série . Ce n'est pas RT-37798 bug, mais je pense que c'est un bug aussi. Si nous commenter stop() méthode à l'intérieur AnimationTimer les mêmes données seront ré-ajoutées et nous commençons à obtenir tout cela NullPointerException.

L'exception est en ligne XYChart.java 1525:

for(int i=c.getFrom(); i<c.getTo(); i++) { 
         getData().get(i).setSeries(Series.this); 
         // update linkedList Pointers for data in this series 
         if (begin == null) { 
          begin = getData().get(i); 
          begin.next = null; 
         } else { 
          if (i == 0) { 
           getData().get(0).next = begin; 
           begin = getData().get(0); 
          } else { 
           Data<X,Y> ptr = begin; 
           for (int j = 0; j < i -1 ; j++) { 
            ptr = ptr.next; // NPE HERE!!!!! 
           } 
           getData().get(i).next = ptr.next; 
           ptr.next = getData().get(i); 
          } 
         } 
        } 

Mais si je tente de supprimer tous les éléments dans le ObservableList, puis ajoutez ceux que je veux, je reçois le NullPointerException lié au bug que vous avez mentionné (RT- 37798). Donc, il semble que je suis condamné, rien que je puisse faire jusqu'à ce qu'ils corrigent le bug.

+1

Jetez un oeil à cette question et de répondre: http://stackoverflow.com/a/24359013/682840 –

+0

Donc, encore une fois un autre bug JavaFX, je envisage de passer à nouveau à Swing ... – Andres

+0

@ JohnM.Wright voir mon question éditée – Andres

Répondre

0

Ok, il semble que RT-37798 bug est résolu dans JDK 8u20 Build 21. Soumettre le bug que je dois voir Si je peux obtenir une réponse (https://javafx-jira.kenai.com/browse/RT-37824).

Nous vous remercions de votre aide!

+1

attention: le correctif en U20 pourrait être juste des cosmétiques - ne jetant plus un NPE mais la structure de données interne de la série peut ne pas être synchronisée avec la liste des éléments de données – kleopatra

+0

Oui J'ai lu votre commentaire et j'ai donc décidé de déployer ma propre bibliothèque de graphiques Merci de votre aide! – Andres

1

Il semble que ce ne soit pas data, mais l'un des composants data s null.

je ne pouvais pas trouver le code correspondant à la source, mais si vous regardez

javafx.scene.chart.XYChart$Series$1.onChanged(XYChart.java:1525) 

Im confiant que vous trouvez un déréférencement d'un composant de données.

+0

Cela ne semble pas être le cas, voyez ma question éditée! – Andres

+0

si c'est vraiment lié à https://javafx-jira.kenai.com/browse/RT-37798 - comme je le soupçonne - il n'y a rien à faire sauf attendre que le bug soit résolu :-(La raison la plus profonde est un conception couplée/mise en œuvre avec des rappels aller-retour partout et aucun contrat clair (lire: non documenté) quant à savoir qui est responsable de quoi quand – kleopatra

Questions connexes