Rencontre du tableau de pointeur nul lors de la boucle à travers l'objet. Comment puis-je l'attraper?

StackOverflow https://stackoverflow.com/questions/19842584

  •  29-07-2022
  •  | 
  •  

Question

Je rencontre un pointeur nul lorsque je traverse mon tableau. Y a-t-il un test que je peux exécuter pour savoir ce qui pourrait causer cette erreur ... et peut-être pourquoi il n'y a pas de valeur quand il devrait? Le système s'arrête chez Maptiles [0] [33]. Voici le code:

import java.lang.*;
import java.util.*;
import java.io.*;

public class Map {

MapTile[][] mapTiles;
String imageMap;
String rawMap;

// constructor 
public Map() {
    imageMap = "Map_DragonShrine.jpg";
    rawMap = "Dragon_Shrine.map";
    mapTiles = new MapTile[22][34];
}


// methods
public void loadMapFile() {

    rawMap = file2String(rawMap);

    // array used to hold columns in a row after spliting by space
    String[] mapCols = null;
    // split map using 'bitmap' as delimiter
    String[] mapLines = rawMap.split("bitmap");  
    // assign whatever is after 'bitmap'
    rawMap = mapLines[1];
    // split string to remove comment on the bottom of the file
    mapLines = rawMap.split("#");
    // assign final map
    rawMap = mapLines[0].trim();
    mapLines = rawMap.split("\\n+");

    for(int x = 0; x < mapLines.length; x++) {
        rawMap = mapLines[x] ;
        mapCols = rawMap.split("\\s+");            
        for(int y = 0; y < mapCols.length; y++) {
            mapTiles[x][y] = new MapTile(mapCols[y]);   
        }            
    }   
}       

public void getTileFeatures() {
}

public void checkFeature() {
    for(int x = 0; x < mapTiles.length; x++) {
        for(int y = 0; y < mapTiles[x].length; y++) {
            makeTile(x, y, mapTiles[x][y].getFeature());
            //  java.lang.NullPointerException at mapTiles[0][33]
        }
    }
}

public String file2String(String filename) 
{          
    try{ 
        FileReader fileReader = new FileReader(filename); 
        String fileContents = ""; 
        int i ; 

        while((i =  fileReader.read())!=-1){ 
            char ch = (char)i; 

            fileContents = fileContents + ch;  
        }//end while 

        // System.out.println(fileContents); 
        return fileContents; 
    }
    catch(Exception e){
        System.out.println("File failed to load:" + e); 
        return "Error " + e; 
    } 

}//end file2String

private void makeTile(int x, int y, String features)
{
    System.out.println("line1 " + y + " test");
    //         mapTiles[x][y] = new MapTile();//Assumes your Map class has an array of MapTile objects called mapTiles
    if(features.contains("w")){   mapTiles[x][y].SOLID = true; }
    System.out.println("line2 " + y + " test");
    if(features.contains("s")){   mapTiles[x][y].STATUE = true; }
    System.out.println("line3 " + y + " test");
    if(features.contains("A")){   mapTiles[x][y].VICTORY_A = true; }
    System.out.println("line4 " + y + " test");
    if(features.contains("B")){   mapTiles[x][y].VICTORY_B = true; }
    System.out.println("line5 " + y + " test");
    if(features.contains("a")){   mapTiles[x][y].START_A = true; }
    System.out.println("line6 " + y + " test");
    if(features.contains("b")){   mapTiles[x][y].START_B = true; }
    System.out.println("line7 " + y + " test");
    if(features.contains("h")){   mapTiles[x][y].HAUNTED = true; }
    System.out.println("line8 " + y + " test");
    if(features.contains("d")){   mapTiles[x][y].DIFFICULT = true; }
    System.out.println("line9 " + y + " test");
    if(features.contains("c")){   mapTiles[x][y].SACRED_CIRCLE = true; }
    System.out.println("line10 " + y + " test");
    if(features.contains("u")){   mapTiles[x][y].SUMMONING_CIRCLE = true; }
    System.out.println("line11 " + y + " test");
    if(features.contains("x")){   mapTiles[x][y].EXIT_A = true; }
    System.out.println("line12 " + y + " test");
    if(features.contains("z")){   mapTiles[x][y].EXIT_B = true; }
    System.out.println("line13 " + y + " test");
}//End makeTile

}

Était-ce utile?

La solution

Vous devez initialiser le tableau 2D Maptile en utilisant votre mapLines objet. En ce moment, vous supposez que ce sera toujours 22x34.

Cela pourrait facilement provoquer une cause d'un pointeur nulle où certaines carreaux de carte ne sont pas initialisés. Cela pourrait également provoquer une indexoutofbounds.

Votre erreur va se résumer à cela. Quelque part, vous n'initialisez pas cet index dans le tableau Maptile.

Autres conseils

Utilisez des outils de test unitaire comme JUnit, Mockito pour tester votre classe. De cette façon, vous pouvez configurer MapTile[][] avec des valeurs différentes et exécutez le test contre. Des informations sur Mockito peuvent être trouvées ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top