Problème Null pointer exception

Eminar Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   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 Date d'inscription   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   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 Date d'inscription   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   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