Java.lang.NullPointerException

Fermé
sotec Messages postés 1 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 29 décembre 2011 - Modifié par sotec le 29/12/2011 à 12:18
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 29 déc. 2011 à 12:58
Bonjour,
voila je fais actuellement un programme de taquin en java (puzzle de 9 cases avec une manquante et une image à recomposer) .
Je le créé en modele vue controlleur, et mon modele me renvoi un java.lang.NullPointerException, que je ne trouve pas ><.
l'erreur complete est :

Exception in thread "main" java.lang.NullPointerException
at ITaquin.ITaquin.<init>(ITaquin.java:57)
at Main.main(Main.java:17)
Java Result: 1


la classe Square utilisé est fonctionnelle.


Le main :

import ITaquin.*;
/**
*
* @author guillaume
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ITaquin taquin = new ITaquin();
}
}

la classe modele :

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ITaquin;

/**
*
* @author guillaume
*/

import java.util.*;


public final class ITaquin extends Observable
{
private int piece=0;

static final int DIM=3;

public Square[][] damier = new Square[DIM][DIM];



{
setChanged();
notifyObservers();
}

@Override public String toString()
{
final String LS = System.getProperty("line.separator");
final String TAB = "\t";
String s = TAB;
for(int i=0;i<DIM;i++)
{
for(int j=0;j<DIM;j++ )
{

s =s + damier[i][j].getNumImage() + (i<DIM-1 ? TAB : LS+TAB);
}
}

return s;
}


public ITaquin()
{
int x = 0;

for(int i=0;i<DIM;i++)
{
for(int j=0;j<DIM;j++ )
{
x++;
damier[i][j].setNum(x); // ligne 57 ou netbean désigne l'erreur
damier[i][j].setNumImage(x);

}
}
melanger();

}


public void melanger()
{
int max = getNumAleatoire();
for(int i=0;i<max;i++)
{
for(int j=0;j<max;j++ )
{
damier[i%DIM][j%DIM].echangerCaseVide(i%DIM,j%DIM);

}
}
}
public int getNumAleatoire()
{
int indice=(int)(Math.random()*(DIM*DIM))+1;

if(existe(indice)==true || indice==0)
{
while(existe(indice)==true)
{indice=(int)(Math.random()*DIM*DIM)+1;}
}


piece=piece*10+indice;

return piece;
}

public void echanger(int i,int j)
{
damier[i][j].echangerCaseVide(i,j);
}

public void reset()
{
for(int i=0;i<DIM;i++)
{
for(int j=0;j<DIM;j++ )
{

damier[i][j].reset();
}
}
}





public boolean existe(int indice)
{ boolean b=false;
int inter = piece;

while(inter>0)
{
if(inter%10==indice){b=true;}
inter=inter/10;
}

return b;
}


public boolean verifierVictoire()
{
if(damier[0][0].getNumImage()==1 &&
damier[0][1].getNumImage()==2 &&
damier[0][2].getNumImage()==3 &&
damier[1][0].getNumImage()==4 &&
damier[1][1].getNumImage()==5 &&
damier[1][2].getNumImage()==6 &&
damier[2][0].getNumImage()==7 &&
damier[2][1].getNumImage()==8 &&
damier[2][2].getNumImage()==9 )
{
return true;
}
else
return false;
}


}



Je vous remercie de votre temps perdu à regarder mon code ><
et merci d'avance pour vos reponses.

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
29 déc. 2011 à 12:58
Évite d'utiliser autant que possible du code statique comme tu l'as fait ici :

public Square[][] damier = new Square[DIM][DIM]; 
{
    setChanged(); 
    notifyObservers(); 
}

Le mieux est de faire l'initialisation proprement dans le constructeur :

public ITaquin() 
{
    damier = new Square[DIM][DIM];
    setChanged(); 
    notifyObservers(); 
    
    int x = 0;
    
    for(int i=0; i<DIM; i++)
    for(int j=0; j<DIM; j++)
    {
        x++;
        damier[i][j] = new Square(...); // étape qu'il manque à ton code
        damier[i][j].setNum(x); // ligne 57 ou netbean désigne l'erreur
        damier[i][j].setNumImage(x);
    }
}
0