Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec une exception

Une exception est levé mais je en sais pas pourquoi

    9 octobre 2010 à 17:50:21

    Bonjour,

    Je suis débutant en Java et j'essaie de reproduire le schéma de rendu que j'utilise en C++ avec SFML.
    Le code suivant lève une exception je comprends pas d'où ça vient.

    Voici le code
    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.util.ArrayList;
    
    interface Drawable 
    {
        public void draw(Graphics g,int w,int h);
    }
    
    class Boule implements Drawable
    {        
        public void draw(Graphics g, int w,int h)
        {
            g.setColor(Color.black);
            g.fillOval(50, 50, 50, 50); 
        }
    }
    
    class RenderWindow extends JPanel
    {
        private JFrame fen;
        private ArrayList<Drawable> list;
        
        public RenderWindow(int w,int h,String title)
        {
            fen = new JFrame();
            fen.setTitle(title);
            fen.setSize(w, h);
            fen.setLocationRelativeTo(null);
            fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
            fen.setContentPane(this);
            fen.setVisible(true);
            
            list = new ArrayList<Drawable>();
        }    
        
        public void paintComponent(Graphics g)
        { 
            for(Drawable d :list)
            {
                d.draw(g,fen.getWidth(), fen.getHeight());
            }
            list.clear();
        } 
        
        public void draw(Drawable d)
        {
            list.add(d);
        }
        
        public void display()
        {
            try 
            {
                Thread.sleep(100);
            }
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
            repaint();
        }
    }
    
    public class Main {
    
        public static void main(String[] args) 
        {
            RenderWindow rwin = new RenderWindow(300,300,"test");
            Boule b= new Boule();
            while(true)
            {
                rwin.draw(b);
                rwin.display();
            }
        }
    
    }
    


    Et voici la pile de fonction
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at RenderWindow.paintComponent(Main.java:41)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at javax.swing.JComponent.paintChildren(JComponent.java:862)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
        at javax.swing.JComponent.paintChildren(JComponent.java:862)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:34)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1793)
        at java.awt.Window.paint(Window.java:3375)
        at sun.awt.RepaintArea.paintComponent(RepaintArea.java:276)
        at sun.awt.RepaintArea.paint(RepaintArea.java:241)
        at apple.awt.ComponentModel.handleEvent(ComponentModel.java:263)
        at apple.awt.CWindow.handleEvent(CWindow.java:465)
        at java.awt.Component.dispatchEventImpl(Component.java:4790)
        at java.awt.Container.dispatchEventImpl(Container.java:2143)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4544)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
            at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
            at java.util.AbstractList$Itr.next(AbstractList.java:343)
            at RenderWindow.paintComponent(Main.java:41)
            at javax.swing.JComponent.paint(JComponent.java:1029)
            at javax.swing.JComponent._paintImmediately(JComponent.java:5098)
            at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:811)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
            at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
            at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


    J'ai ces deux exceptions mais quoi qu'il en soit l'application est parfaitement fonctionnelle. Merci d'avance de m'aider.
    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2010 à 18:04:34

      la deuxieme exception viens d'une modification de list concurente. cela arrive quand tu fait ton foreach dans dans ton paint component se produit en meme temps que ton list.add().

      si tu veux y remedier tu peux utiliser un iterator a la place du foreach:
      Iterator<Drawable> it = list.iterator();
      while(it.hasNext()){
          //fait se que tu veux
      }
      


      par contre pour le null pointer exception sa vient du faite que tu utilise un objet dont sa valeur est null.
      la je ne vois pas exactement ou.

      Sinon il serait peut être bon que tu disent plus exactement se que tu veux faire car je trouve ton code pour le moins originale.
      • Partager sur Facebook
      • Partager sur Twitter
        9 octobre 2010 à 18:34:09

        C'est à peu près ce que j'avais déduis.

        Alors moi je veux pouvoir créer des objet qui dessine dans une fenêtre. Le seul moyen que je connaisse pour dessiner c'est de passer par public void paintComponent(Graphics g);

        Par contre la solution que tu me propose ne correspond pas à la façon dont j'aimerai que se comporte l'application. Comme l'ai dit j'aimerai crée des objets, et les faire dessiner un à un dans la fenêtre et enfin dessiner, mais ne dessiner que quand j'appelle display. du mono thread en gros.

        Enfin je pense que je vais devoir revoir mon design ça colle pas trop au fonctionnement des JPanel.

        Pour le pointeur null je vois pas d'où ça peut bien venir.

        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2010 à 18:38:24

          la méthode avec l'iterateur fait exactement pareil que la boucle foreach seulement elle ne sera pas affecter par le concurrent modification.
          • Partager sur Facebook
          • Partager sur Twitter
            9 octobre 2010 à 19:44:44

            En fait ce que je veux dire c'est que c'est la cause (accès concurrentiel) plutôt que la conséquence que j'aurai aimé corriger. Je sens que je vais mettre un mutex et ça sera réglé.

            Tu peux m'expliquer pourquoi il y a une différence entre les deux boucles.
            • Partager sur Facebook
            • Partager sur Twitter

            Problème avec une exception

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown