2010-04-13 7 views
0

J'ai une classe, "Tetris", dans laquelle une des variables d'instance est "tableau". "board" est un tableau 2D d'objets Color. Lors de la création d'un objet tetris, j'appelle une méthode qui définit les dimensions de la carte, puis définit tous les objets Color comme valeur par défaut, c'est-à-dire Color.blue.Exception de pointeur nul sur un tableau 2D (Java)

public Tetris(int rows, int cols) { 
    this.rows = rows; 
    this.cols = cols; 
    reset(rows, cols); 
} 

public void reset(int rows, int cols) { 
    Color[][] board = new Color[rows][cols]; 
    for(int i = 0; i<this.rows; i++) { 
    for(int j = 0; j<this.cols; j++) { 
     board[i][j] = DEFAULT_COLOR; // Color.blue; //DEFAULT-COLOR 
    } 
    } 
} 

Malheureusement, quand je lance le code (qui n'a évidemment pas été écrit dans son intégralité) Je reçois une exception de pointeur nul sur la ligne:

board[i][j] = DEFAULT_COLOR; // Color.blue; //DEFAULT-COLOR. 

Y at-il de toute évidence de mal à ce que je fais?

+0

N'a rien à faire avec le NPE, mais dans la réinitialisation, vous devez soit passer en lignes/cols OU utiliser this.rows/this.cols, mais pas les deux. En outre, Color [] est créé localement et non retourné ou défini sur un champ d'instance. – Thilo

+0

Avez-vous un membre de classe nommé board? Si tel est le cas, votre fonction de réinitialisation, comme Jon l'a mentionné, n'initialise pas ce membre puisque votre tableau de variables local remplace le membre de la classe, qui n'est jamais initialisé. – Ernelli

Répondre

-2

Je pense que vous devez allouer chacun de ces couleurs comme ceci: Conseil [i] [j] = new Color (...

+0

Cela ne sert à rien - utiliser DEFAULT_COLOR signifie simplement que chaque élément du tableau fait référence au même objet. En particulier, cela ne provoquerait pas une exception NullPointerException dans l'affectation. –

2

Il serait utile si vous souhaitez publier un programme court mais complet Le code que vous avez posté n'est pas suffisant pour déclencher une exception, mais je peux voir comment il pourrait le faire avec quelques changements

En particulier, il me semble étrange que vous déclariez un nouvelle variable locale au sein de votre reset méthode ... et vous également ont une variable d'instance appelée board? Je soupçonne que la solution peut être aussi simple que de changer le début de reset à:

board = new Color[rows][cols]; 

Si votre code réel utilise la variable locale pour créer le tableau, mais essaie ensuite d'attribuer des valeurs via la variable d'instance, qui pourrait très bien être la cause du problème.

Il semble aussi mal que vous passez dans la méthode rows et cols, et l'utilisation de ces paramètres dans un seul endroit, mais les variables d'instance this.rows et this.cols dans la boucle. Pourquoi s'embêter à les passer?

Questions connexes