IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Crash à des moments aléatoires, java.lang.NullPointerException


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Crash à des moments aléatoires, java.lang.NullPointerException
    Bonjour,

    Dans le cadre de mes cours d'informatique, on nous a demander de coder une sorte de "jeu de pong" en java.
    Les contraintes ne sont pas très strictes, le but est surtout de découvrir le langage java par nous même en prétextant ce petit projet.
    (A noté que nous avons déjà étudié le C++ )

    Seulement voilà, après avoir appris le fonctionnement de la bibliothèque Swing, je me suis lancé dans le code du pong.
    Le code fonctionnait très bien jusqu'à l'étape: "Je rajoute des boutons"
    C'est à dire, j'avais un nombre aléatoires de balles qui se baladaient et rebondissaient dans ma fenêtre.
    J'ai ensuite décidé de rajouter 2 boutons, un pour incrémenter et l'autre pour décrémenter le nombre de balles dans ma fenêtre.

    Et là... Miracle! ça fonctionne ! ou presque...

    Pour une raison obscure, le code fini toujours par crasher lors d'une incrémentation ou décrémentation, mais ce, de manière complément aléatoire!
    ça ne dépend ni du nombre de balles dans la fenêtre, ni de la vitesse de clique souris, c'est entièrement aléatoire...

    Voici une vidéo pour que vous puissiez visionner le problème tel que je l'ai sur mon ordinateur:
    https://mega.nz/#!CVsUHLRA!cR_ptNgiU...YM0xM6SujCQst8
    et voici le code:
    https://mega.nz/#!qV1hEYZC!rxarEYvRN...3iacNQ9KD2o2tQ

    Il n'est absolument pas optimisé, je le reconnais, et les collisions ne sont pas optimales, mais ce n'est pas ce que j'ai cherché à travailler sur cet exercice.

    A noté que je travail avec Eclipse, en version jre 1.8.0_121 et que eclipse m'indique comme erreur:
    "Exception in thread "main" java.lang.NullPointerException
    at Panneau.move(Panneau.java:52)
    at Fenetre.go(Fenetre.java:21)
    at Fenetre.<init>(Fenetre.java:71)
    at PongFinal.main(PongFinal.java:6)"

    Si quelqu'un peut m'aider ? J'avoue que j'ai bien cherché mais je ne trouve vraiment pas le soucis

    Je vous remercie et vous souhaite une bonne nuit

    Julien.

  2. #2
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Peux tu simplement poster la classe Panneau, en utilisant la balise code? Ta trace indique que l'erreur est levée par la méthode move, on va commencer par là ...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Salut!
    Merci pour ta réponse.

    Voici ma classe Panneau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    import java.awt.Graphics;
    import javax.swing.JPanel;
    import java.awt.Color;
     
    @SuppressWarnings("serial")
    public class Panneau extends JPanel{
    	private int[] limits;
    	private Ball[] b;
    	private int nbOfBalls = 1+(int)(Math.random()*4);
    	private int[][] col;
     
    	public Panneau(){
    		initPanneau();
    	}
     
    	public void initPanneau(){
    		limits = new int[8];
    		b = new Ball[nbOfBalls];
    		for (int i=0;i<b.length;i++)		
    			b[i] = new Ball();
    		col = new int[b.length][];
    		for (int i=0;i<b.length;i++)		
    			col[i] = new int[b.length];
    	}
     
    	public void paintComponent(Graphics g){	
    		limits[0]= 0;
    		limits[1]= getWidth();
    		limits[2]= 0;
    		limits[3]= getHeight();
    		limits[4]= (int)(getWidth()/2)-100;
    		limits[5]= (int)(getWidth()/2)+100;
    		limits[6]= (int)(getHeight()/2)-300;
    		limits[7]= (int)(getHeight()/2)+300;
     
    		for (int i=0;i<b.length;i++){		
    			for (int j=0;j<b.length;j++){
    				if(col[i][j]>0)
    					col[i][j]--;
    			}
    		}
     
    		draw(g);
     
    		for (int i=0;i<b.length;i++)
    			b[i].paintComponent(g);
    			//System.out.println(nbOfBalls);		
    	}
     
    	public void move(){
    		for (int i=0;i<b.length;i++)
    			b[i].moveBall(limits);
    		Collisions(b,b.length,(b.length-1));
    	}
     
    	private void Collisions(Ball[] balls, int i, int j){
    		if (i==1)
    			return;
    		boolean boolCol=false;
    		if (col[i-1][j-1]==0)
    			boolCol = testCollision(balls[i-1],balls[j-1]);
    		if (boolCol==true)
    			col[i-1][j-1]=10;
    		if (j-1>0)
    			Collisions(balls,i,j-1);
    		else
    			Collisions(balls,i-1,i-2);
    	}
     
    	private boolean testCollision(Ball one, Ball two){
    		int r1=one.getRadius();
    		int r2=two.getRadius();
    		int x1=one.getPosX()+(int)(java.lang.Math.sqrt(2)*r1);
    		int x2=two.getPosX()+(int)(java.lang.Math.sqrt(2)*r2);
    		int y1=one.getPosY();
    		int y2=two.getPosY();
    		int vx1=one.getVx();
    		int vy1=one.getVy();
    		int vx2=two.getVx();
    		int vy2=two.getVy();
     
    		if (java.lang.Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))<(r1+r2)){
    /*			if ((x2-x1)>(y2-y1)){
    				two.setVy(vy1);
    			}
    			if ((x2-x1)<=(y2-y1)){
    				two.setVx(vx1);
    			}
    */
    			one.setVx(-vx1);
    			one.setVy(-vy1);
    			two.setVx(-vx2);
    			two.setVy(-vy2);
    			return true;
    		}
    		else
    			return false;
    	}
     
    	private void draw(Graphics g){
    		g.setColor(Color.white);
    		g.fillRect(0, 0, getWidth(), getHeight());
     
    		//PONG
    			//Fond
    			g.setColor(Color.black);
    			g.fillRect(limits[4], limits[6],200,600);
     
    			//P
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+40, 20, 100);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+40, 100, 20);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+130, limits[6]+40, 20, 50);	
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+70, 100, 20);
     
    			//O
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+180, 20, 100);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+130, limits[6]+180, 20, 100);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+180, 100, 20);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+260, 100, 20);
     
    			//N		
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+320, 20, 100);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+130, limits[6]+330, 20, 90);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+330, 100, 20);
     
    			//G		
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+460, 20, 100);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+460, 100, 20);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+50, limits[6]+540, 100, 20);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+130, limits[6]+500, 20, 40);
     
    			g.setColor(Color.white);
    			g.fillRect(limits[4]+110, limits[6]+500, 40, 20);
     
    		}
     
    	public int getNbOfBalls() {
    		return nbOfBalls;
    	}
     
    	public void setNbOfBalls(int nbOfBalls) {
    		this.nbOfBalls = nbOfBalls;
    	}
     
    	public Ball[] getB() {
    		return b;
    	}
     
    	public void setB(Ball[] b) {
    		this.b = b;
    	}
     
    }

  4. #4
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    A mon avis, tu ne modifies pas la taille du tableau au bon moment, ton appel va donc chercher un index qui renvoi null.

    Essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void move(){ 
      for (int i=0;i<b.length;i++) {
        if (b[i] != null) b[i].moveBall(limits);
      }
      Collisions(b,b.length,(b.length-1)); 
    }
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    J'ai plus la même erreur, maintenant il me dit:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
    at Panneau.Collisions(Panneau.java:66)
    at Panneau.move(Panneau.java:58)
    at Fenetre.go(Fenetre.java:21)
    at Fenetre.<init>(Fenetre.java:71)
    at PongFinal.main(PongFinal.java:6)

    Voici le code de Fenetre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class Fenetre extends JFrame{
    	private Panneau pan = new Panneau();
    	private int high = 800;
    	private int weight = 1800;
    	private JButton bouton_haut = new JButton("Rajouter une balle");
    	private JButton bouton_bas = new JButton("Supprimer une balle");
    	private JPanel container = new JPanel();
     
    	private void go(){		
    		while(true){
    			pan.move();		
    			pan.repaint();
    			try{
    				Thread.sleep(10);
    			}
    			catch (InterruptedException e){
    				e.printStackTrace();
    			}	
    		}
    	}
     
    	public Fenetre(){
    		//Créé notre fenetre
    		this.setTitle("Fenêtre pour Pong");  //Titre
    	    this.setSize(weight,high);  //Taille
    	    this.setLocationRelativeTo(null);  //Centré sur l'écran
    	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //Ferme le programme avec la croix
     
    	    container.setBackground(Color.white);
    	    container.setLayout(new BorderLayout());
    	    container.add(pan,BorderLayout.CENTER);
    	    container.add(bouton_haut, BorderLayout.NORTH);
    	    container.add(bouton_bas, BorderLayout.SOUTH);
     
    	    bouton_haut.addActionListener(new ActionListener(){
    	    	public void actionPerformed(ActionEvent event){
    	    		int temp = pan.getNbOfBalls();
    	    		temp = temp + 1;
    	    		pan.setNbOfBalls(temp);
    	    		pan.initPanneau();
    	    		//Ball[] temp_ball = pan.getB();
    	    		//int temp2 = temp_ball.length;
     
    	    	}
    	    });
     
    	    bouton_bas.addActionListener(new ActionListener(){
    	    	public void actionPerformed(ActionEvent event){
    	    		int temp = pan.getNbOfBalls();
    	    		if (temp >1) {
    		    		temp = temp - 1;
    		    		pan.setNbOfBalls(temp);
    		    		pan.initPanneau();
    	    		}
    	    	}
    	    });
     
    	    this.setContentPane(container);
     
    	    setVisible(true);  //Afficher la fenetre
    	    go();
    	}
     
    }

  6. #6
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Toujours un problème de tableau... cette fois, tu appel un index supérieur à la taille de ton tableau, dans la classe collision. A mon avis, tu devrais travailler avec une List de Ball, ca t'éviterais des ennuis... si pas possible, faut voir Collision
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    J'ai trouvé!

    J'ai modifié collisions pour qu'il vérifie systématique si les pointeurs balls existent ou non avant de lancer la collision:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private void Collisions(Ball[] balls, int i, int j){
    		if (i==1)
    			return;
    		boolean boolCol=false;
     
                    if (balls[i-1] != null && balls[j-1] != null) {
     
    		    if (col[i-1][j-1]==0)
    			    boolCol = testCollision(balls[i-1],balls[j-1]);
        		    if (boolCol==true)
    			    col[i-1][j-1]=10;
    		    if (j-1>0)
    			    Collisions(balls,i,j-1);
    		    else
    			    Collisions(balls,i-1,i-2);
    	}
    Merci pour ton aide!

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ta fonction move, tu l'appelle comment? Je suspected que ton problème vienne de ton move() s'effectuant en dehors de l'EDT (Event Dispatcher Thread), donc sur un thread séparé. Donc entre tes boutons qui changent la taille des tableaux et move qui les utilise, tu as plusieurs thread et ton code n'est pas du tout protégé comme il se doit par rapport à la programmation multithread. Le plus simple dans ton cas est de bien tout faire dans l'EDT, donc de t'assurer que move est bien lancé sur l'EDT (les actions des boutons et l'affichage tournent déjàsur l'EDT). Si move est appelée régulièrement, ca veux dire utiliser un javax.swing.Timer (pas un java.util.Timer!). Faudrait le code complet pour voir le problème mais vu que tu l'a mis sur un serveur banni dans la moitié du globe, je n'y ai pas accès

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/12/2016, 16h57
  2. Réponses: 3
    Dernier message: 21/11/2011, 19h37
  3. Réponses: 8
    Dernier message: 11/05/2006, 19h32
  4. [JDIC]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Par kedare dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 06/05/2006, 22h45
  5. java.lang.NullPointerException getparent()
    Par guano dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 17/03/2006, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo