Problème Null pointer exception

Eminar Messages postés 26 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour, je débute en java et surtout avec les classes. J'ai un problème de Null pointer exception. Pouvez vous me dire d'où vient-elle ? Sachant que la classe CaseMur implémente la classe Icase. colonnes est quant à lui initialisé dans le main.

Merci d'avance !

class Plateau {
Icase plateau [][] ;

void tableau() {

for(int i=0; i<colonnes + 2; i++){
this.plateau [ i ] [1]=new CaseMur();
this.plateau [i ][colonnes+2]=new CaseMur();
}
}

2 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Tu l'as initialisé ton tableau avant de mettre des valeurs dans des cases qui n'existent pas ?
0
Eminar Messages postés 26 Statut Membre
 
Je pensais que lorque j'écrivais Icase plateau [][], ça initialisait automatiquement.
il faut donc que je fasse une boucle for, et je met quelle valeur dans chaque case ?
En fait quand tu dis initialiser, tu veux dire mettre une valeur dans chaque case ?

(désolé si les questions peuvent paraître bêtes)
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Il faut donner des valeurs aux objets que tu manipules, si tu fais :

int n;
String s;
Icase[][] plateau;

Tu n'as pas précisé de valeurs aux différentes références, par défaut elles vaudront 0 pour l'entier et null pour les objets. Si tu les manipules tu obtiendras un NullPointerException.

Ce qu'il faut faire c'est donner des valeurs aux objets, et en particulier pour les tableaux, leur donner une taille !

int n = 42;
String s = "Bonjour";
Icase[][] plateau = new Icase[10][10];
0
Eminar Messages postés 26 Statut Membre
 
Merci beaucoup ! Ça marche !
Une autre petite question, qui vous paraîtra sans doute évidente. Si je veux que toutes les cases de mon tableau qui ne sont pas des CaseMur deviennent des CaseVide, je peux le faire comme ça ?
   for (int i=0; i<plateau.length; i++){
     for (int j=0; i<plateau.length; i++){
       if ( plateau[i][j] instanceof CaseMur){
       }else{
         plateau [i][j] = new CaseVide();
       }
     }
   }   
 


Car ça ne fonctionne pas et je comprends pas pourquoi ?
Ca me permettrait d'aller plus vite que de les initialiser une par une.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Si ton tableau est déclaré par l'interface ICase et que tu as CaseMur implements ICase et CaseVide implements ICase alors l'affectation devrait fonctionner.

Cependant ton imbrication de boucle for est fausse, il faudrait plutôt écrire :
for (int i=0; i<plateau.length; i++)
     for (int j=0; j<plateau[i].length; j++)
0