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

avec Java Discussion :

Problème "java.lang.NullPointerException"


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Problème "java.lang.NullPointerException"
    Bonjour amis codeurs ,je vous expose mon problème qui aboutit a java.lang.NullPointerException.
    L'erreur se produit quand j'appelle la méthode afficherSolution() sur la ligne fen.solution[i].color =Color.white;

    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
    public void afficherSolution(){
            for (int i=0;i<4;i++){
                switch(solution[i]){
                case 0 :
                    fen.solution[i].color=Color.white;
                    break;
                case 1 :
                    fen.solution[i].color=Color.blue;
                    break;
                case 2 :
                    fen.solution[i].color=Color.yellow;
                    break;
                case 3 :
                    fen.solution[i].color=Color.orange;
                    break;
                case 4 :
                    fen.solution[i].color=Color.pink;
                    break;
                case 5 :
                    fen.solution[i].color=Color.red;
                    break;
                case 6 :
                    fen.solution[i].color=Color.green;
                    break;
                case 7 :
                    fen.solution[i].color=Color.cyan;
                    break;               
                }
     
                fen.solution[i].repaint();
            }
    Alors je me suis dit ha j'ai zapper de l'initialiser mais non en fait : cette portion de code est issu du constructeur de la classe Fenetre qui est appelée dans le main .( Grosso modo j'ai deux classes une qui gère l' affichage et une qui calcule les modification a effectuées sur la première en fonction des boutons pressé )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i=0;i<4;i++){
                solution[i]=new MasterLabel(Color. BLACK);
                soluc.add(solution[i]);
            }
    Alors je suis un peu perdu...
    Merci d'avoir pris le temps de me lire, et éviter de me dire que le problème est résolu 20 fois sur le forum utilise la fonction...je rame déjà depuis un bout de temps...les erreurs commises ne sont généralement pas la même que la mienne maintenant.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Je soupçonne une erreur de scope,

    Mets nous le code entier de ta classe, car sans pouvoir situer les déclarations et initialisations on ne pourra rien pour toi.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    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
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
     
     
    public class Fenetre {
    	MasterButton blanc=new MasterButton(Color.WHITE); //num =>0
    	MasterButton bleu=new MasterButton(Color.BLUE);
    	MasterButton jaune=new MasterButton(Color.YELLOW);
    	MasterButton orange=new MasterButton(Color.ORANGE);
    	MasterButton rose=new MasterButton(Color.PINK);
    	MasterButton rouge=new MasterButton(Color.RED);
    	MasterButton vert=new MasterButton(Color.GREEN); 
    	MasterButton cyan=new MasterButton(Color.CYAN);//num =>7
    	MasterButton gris=new MasterButton(Color.GRAY);
    	MasterLabel [][] plateau =new MasterLabel[4][10];
    	MasterRep [] rep=new MasterRep[10];
    	MasterLabel[] solution=new MasterLabel[4];
     
    	Fenetre(){
    		JPanel terrain = new JPanel();
    	    GridLayout dispoterrain = new GridLayout(10,4,1,1);
    	    terrain.setLayout(dispoterrain);
    	    for(int j=0;j<10;j++){
    	    	for (int i=0;i<4;i++){	    	
    	    		plateau[i][j]=new MasterLabel(Color.GRAY);
    	    		terrain.add(plateau[i][j]);
    	    	}
    	    }
    	    Calcul motCalcul=new Calcul(this);
    	    JPanel choix=new JPanel();
    	    GridLayout dispochoix=new GridLayout(2,3,5,5);
    	    choix.setLayout(dispochoix);
    	    choix.add(bleu);
    	    bleu.addActionListener(motCalcul);
    	    choix.add(jaune);
    	    jaune.addActionListener(motCalcul);
    	    choix.add(vert);
    	    vert.addActionListener(motCalcul);
    	    choix.add(cyan);
    	    cyan.addActionListener(motCalcul);
    	    choix.add(blanc);
    	    blanc.addActionListener(motCalcul);
    	    choix.add(orange);
    	    orange.addActionListener(motCalcul);
    	    choix.add(rose);
    	    rose.addActionListener(motCalcul);
    	    choix.add(rouge);
    	    rouge.addActionListener(motCalcul);
     
     
    	    JPanel soluc=new JPanel();
    	    GridLayout disposoluc=new GridLayout(1,4);
    	    soluc.setLayout(disposoluc);
     
    	    for (int i=0;i<4;i++){
    	    	solution[i]=new MasterLabel(Color.BLACK);
    	    	soluc.add(solution[i]);
    	    } 
     
     
    	    JPanel reponse=new JPanel();
    	    GridLayout disporeponse=new GridLayout(10,1);
    	    reponse.setLayout(disporeponse);
    	    for (int i=0;i<10;i++){
    	    	rep[i]=new MasterRep();
    	    	reponse.add(rep[i]);
    	    }
     
     
    	    JPanel global=new JPanel();
    	    BorderLayout dispoglobal=new BorderLayout();
    	    global.setLayout(dispoglobal);
    	    global.add(BorderLayout.CENTER,terrain);
    	    global.add(BorderLayout.SOUTH,choix);
    	    global.add(BorderLayout.NORTH,soluc);
    	    global.add(BorderLayout.EAST,reponse);	    
     
    	    JFrame cadre = new JFrame("Mastermind"); 
    	    cadre.setContentPane(global); 	   
    	    cadre.pack(); 
    	    cadre.setVisible(true); 
    	    cadre.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	}
    }
    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
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
    public class Calcul implements ActionListener{
    	Fenetre fen;
    	int i=0;
    	int j=0;
    	int[] test=new int[4];
    	int[] solution=new int[4];
    	int bp=0;
    	int mp=0;
     
    	public Calcul(Fenetre fen){
    		this.fen=fen;
    		combinaison();
    	}
     
    	public void combinaison(){
    		for(int i=0;i<4;i++){
    		solution[i]=(int) (Math.random()*8);
    		}		
    	}
     
    	public boolean testresultat(){
    		int[] clonesol=solution.clone();
    		bp=mp=0;
    		for (int i=0;i<4;i++){
    			if (test[i]==solution[i]) {
    				bp=bp+1;
    				test[i]=-1;
    				clonesol[1]=-1;
    			}
    		}
    		for (int i=0;i<4;i++){
    			for(int j=0;j<4;j++){
    				if (!(test[i]==-1) && !(clonesol[j]==-1)){
    					if (test[i]==clonesol[j]){
    						mp=mp+1;
    					}
    				}
    			}
     
    		}
    		if (bp==4) return true;
    		else return false;
    	}
     
    	public void afficherSolution(){
            for (int i=0;i<4;i++){
                switch(solution[i]){
                case 0 :
                    fen.solution[i].color=Color.white;
                    break;
                case 1 :
                    fen.solution[i].color=Color.blue;
                    break;
                case 2 :
                    fen.solution[i].color=Color.yellow;
                    break;
                case 3 :
                    fen.solution[i].color=Color.orange;
                    break;
                case 4 :
                    fen.solution[i].color=Color.pink;
                    break;
                case 5 :
                    fen.solution[i].color=Color.red;
                    break;
                case 6 :
                    fen.solution[i].color=Color.green;
                    break;
                case 7 :
                    fen.solution[i].color=Color.cyan;
                    break;               
                }           
                fen.solution[i].repaint();
            }
    	}
     
     
    	public void actionPerformed(ActionEvent e) {
    		MasterButton clic=(MasterButton) e.getSource();
    		Color coul=clic.color;
    		fen.plateau[i][j].color=coul;
    		fen.plateau[i][j].repaint();
    		test[i]=clic.numButton;
    		if (i<3){
    			i++;
    		}
    		else if(testresultat()){
     
    			//Victoire
    		}
    		else{
    			int a=0;
    			for (int i=0;i<bp;i++){
    				fen.rep[j].color[a]=Color.RED;
    				fen.rep[j].repaint();
    				a++;
    			}
    			for (int i=0;i<mp;i++){
    				fen.rep[j].color[a]=Color.WHITE;
    				fen.rep[j].repaint();
    				a++;
    			}
    			while (!(a==3)){
    				fen.rep[j].color[a]=Color.GRAY;
    				fen.rep[j].repaint();
    				a++;
    			}
    			j++;
    			i=0;
    		}
    	}		
     
     
    	public static void main(String[] args) {
    		Fenetre fen=new Fenetre();
    	}
    }
    Je sent que mon erreur est toute conne :s mais je la trouve pas
    Désolé pour l'absence de commentaire lol, c'est censé faire un mastermind au final !

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, j'ai plusieurs questions :
    pourrais-tu nous donner la trace de l'erreur?
    on ne sait pas d'où est appelée afficherSolution, est-ce bien la même instance de Calcul qu'au départ?
    je ne vois pas d'erreur flagrante, pourrais-tu ajouter des traces? par exemple if(fen == null) {System.out.println("fen est null");} et if(fen.solution[i] == null) {System.out.println("fen.solution["+i+"] est null");}

    ps : ce genre d'erreur est rapide à corriger avec un debugger, cela peut être plus laborieux avec des traces.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Alors il est vrai que l'appel a la méthode est effacé dans ce copier coller :s en fait je l'appelais dans le constructeur de calcul...Le problème est la ??? je vois pas pourquoi mais je n'ai pas beaucoup de recule sur la programmation en général et encore moins sur ce langage.

    La trace c'est ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.lang.NullPointerException
    	at Calcul.afficherSolution(Calcul.java:58)
    	at Calcul.<init>(Calcul.java:18)
    	at Fenetre.<init>(Fenetre.java:34)
    	at Calcul.main(Calcul.java:132)
    Travaillant sous eclipse je dois avoir accès a un debuggeur mais aucune idée de comment ça marche :s je vais m'y mettre !
    Merci de votre aide

  6. #6
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    peut-être
    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
     
    public void afficherSolution(){
            for (int i=0;i<4;i++){
                switch(solution[i]){
                case 0 :
                    fen.solution[i].color=Color.white;
                    break;
                case 1 :
                    fen.solution[i].color=Color.blue;
                    break;
                case 2 :
                    fen.solution[i].color=Color.yellow;
                    break;
                case 3 :
                    fen.solution[i].color=Color.orange;
                    break;
                case 4 :
                    fen.solution[i].color=Color.pink;
                    break;
                case 5 :
                    fen.solution[i].color=Color.red;
                    break;
                case 6 :
                    fen.solution[i].color=Color.green;
                    break;
                case 7 :
                    fen.solution[i].color=Color.cyan;
                    break;
                default:
                    fen.solution[i].color=Color.cyan; //Replacer par la couleur par défaut
                    break;     
                }           
                fen.solution[i].repaint();
            }
    	}
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Pas mieux... il n'arrive pas a interprété cette ligne fen.solution[i] il rentre bien dans le switch puisque mon erreur n'intervient pas toujours a la même ligne (dépendant du calcul aléatoire de la combinaison ).

  8. #8
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    As-tu essayé d'ajouter les traces? qu'on sache au moins si c'est fen ou fen.solution[i] qui est null.

    Sinon pour le debugger, c'est très simple : FAQ Eclipse > Comment debugger une application Java ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Debugger rox :p
    Merci de ton aide ! !
    Alors le problème c'était a priori que le constructeur de Fenetre faisait apel a Calcul avant d'initialiser ce tableau.En effet, j'ai juste deplacer l'initialisation de mon tableau au début de mon constructeur et ca marche.
    Sinon si tu as des commentaires a donné a propos de ma facon de programmer hésite pas je débute et je voudrais pas prendre trop de mauvaise habitude :s
    et pendant que j'y suis :p
    Je soupçonne une erreur de scope
    ça veut dire quoi ?

  10. #10
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Voila quelques remarques :
    Tu as laissé tout tes attributs avec la visibilité par défaut, alors que la plupart pourraient être privés.
    J'aurai mis le 4 en tant que variable public static final, à un seul endroit, comme ça tu évites le problèmes de boucles for qui répètent '4' avec risque d'erreur. (tu pourrais faire facilement un Mastermind de 5 couleurs )
    Du point de vue conception, j'aurai fait une classe Combinaison sans oublier la méthode equals pour vérifier si la proposition du joueur est égale à la solution.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Merci pour ces remarques...Je vais essayer d'en tenir compte !

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

Discussions similaires

  1. Problème avec "java.lang.NullPointerException"
    Par Yokooo dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/04/2010, 16h28
  2. Problème de java.lang.NullPointerException
    Par tpdm dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/07/2008, 13h54
  3. Problème de java.lang.NullPointerException
    Par anduril dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/05/2007, 17h07
  4. problème de java.lang.NullPointerException
    Par vince351 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/03/2007, 08h36

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