2015-01-01 1 views
2

Я делаю маленькую игру в 2D с видом сверху. Я пытаюсь сделать это:NullPointerException при анализе файла для создания карты игры

1) У меня есть локальный файл с картой расположения в .txt

2) Разобрать этот файл и сделать макет карты в игре

3) Краска все на screen

Я (думаю, так) успешно проанализировал файл и поместил его в приложение, но он не смог нарисовать, выбрасывая исключение NullPointerException. Я понимаю, что что-то здесь пустое, но я не вижу, что и где - с моей точки зрения, все, где это должно быть.

Некоторый код:

BufferedReader br = new BufferedReader(new FileReader(s)); 

     mapwidth = Integer.parseInt(br.readLine()); 
     mapheight = Integer.parseInt(br.readLine()); 


     String delimiters = " "; 
     for (row = 0; row < mapheight; row++){ 
      String line = br.readLine(); 
      String[] tokens = line.split(delimiters); 
      for (col = 0; col < mapwidth ; col++){ 
       map[row][col] = Integer.parseInt(tokens[col]); 

      } 
     } 

Это функция для разбора файла в программу. Первые две строки читают ширину и высоту карты (из указанного файла), затем для каждого значения в файле я создаю точку на карте [строка] [col]

Это еще одна функция, ответственная за создание объектов для каждой точки карты

String wall ="Images/wall.jpg"; 
BufferedImage WALL = ImageIO.read(new File(wall)); 
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); } 

Последняя строка бросает исключение NullPointerException. Плитка это одно поле в моей игре. Он имеет четыре значения - BufferedImage, заблокирован, доступен для ходьбы и разрушается (последние три являются логическими). Кроме того, не имеет значения, поставил ли я код для создания объектов вместе с синтаксическим кодом. Тем не менее у меня есть исключение. Я понимаю, что здесь что-то не хватает, но я не могу понять, что.

Позже я хочу рисовать все плитки:

public void paint(Graphics g){    
    for (row=0; row < mapheight; row++) 
     for(col = 0; col < mapwidth; col++){ 
      g.drawImage(
        tile[row][col].getImage(), 
          row*tileSize, 
          col*tileSize, 
          null 
         ); 

Я думаю, что это может иметь некоторые ошибки, но я не уверен. То, что я хочу сделать, - это взять изображение каждой плитки и нарисовать ее в соответствующих строках и столбцах. Каждое поле представляет собой квадрат (length = tileSize).

EDIT

Спасибо всем, ребята!

@Thierry - после отладки я узнал, что плитка все еще была нулевой и не заполнялась. Итак, я сделал пустой экземпляр плитки и объединил эти две функции. Сейчас это выглядит и работает правильно:

public GameTileMap(String s, int tileSize){ 
    this.tileSize = tileSize; 

    try{ 
     BufferedReader br = new BufferedReader(new FileReader(s)); 

     mapwidth = Integer.parseInt(br.readLine()); 
     mapheight = Integer.parseInt(br.readLine()); 
     map = new int[mapheight][mapwidth]; 
     tile = new Tile[mapheight][mapwidth]; 

     int mh = mapheight; 
     int mw = mapwidth ; 

     String delimiters = " "; 
     for (row = 0; row < mh; row++){ 
      String line = br.readLine(); 
      String[] tokens = line.split(delimiters); 
      for (col = 0; col < mw ; col++){ 
       map[row][col] = Integer.parseInt(tokens[col]); 

      } 
     } 
     String wall ="Images/wall.jpg"; 
     String brick = "Images/brick.jpg"; 
     String grass ="Images/grass.jpg"; 
     String water = "Images/water.jpg"; 
     BufferedImage WALL = ImageIO.read(new File(wall)); 
     BufferedImage BRICK = ImageIO.read(new File(brick)); 
     BufferedImage GRASS = ImageIO.read(new File(grass)); 
     BufferedImage WATER = ImageIO.read(new File(water)); 
     for (row = 0; row < mh; row++){ 
      for (col = 0; col < mw ; col++){ 

     if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false); } 
     else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);} 
     else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);} 
     else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);} 
     else {tile[row][col] = new Tile(GRASS, false, true, false);}; 
      } 
     } 
    } 
    catch(Exception e){ 
    e.printStackTrace();} 

} 
+0

Является ли это кодом, вызывающим ваше исключение: 'if (map [row] [col] == 0) {tile [row] [col] = new Tile (WALL, false, true, false); } '? Просто убедившись, что я правильно понимаю. –

+3

Исключение stacktrace содержит ответ. по крайней мере, сузить его до линии, за исключением того, что выбрано исключение – ata

+0

@ Ата - Я уже это сделал, я указал, какая линия вызывает проблемы. – WarmasterMazuran

ответ

3

Если у вас есть NPE в:

if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); 

, то есть только 4 решения:

  • карта является нулевой
  • или карта [строка] является нулевым
  • или плитка null
  • или плитка [ряд] -
1

После выполнения этого:

for (row = 0; row < mapheight; row++){ 
     String line = br.readLine(); 
     String[] tokens = line.split(delimiters); 
     for (col = 0; col < mapwidth ; col++){ 
      map[row][col] = Integer.parseInt(tokens[col]); 

     } 
    } 

как row и col будет выходить из границы, из-за последнего ряда ++ и цв ++. Вот почему вы получаете отказа от связанной ошибке при попытке получить доступ к if (map[row][col] == 0)

NullPointerException в массиве означает, что вы каким-то образом ссылки на индекс меньше 0 или больше, чем длина () - 1.

+0

Не будет причиной исключения 'ArrayIndexOutOfBounds', а не' NullPointerException'? –

+0

Это должно привести к тому, что на самом деле. @dudeprgm – Jobs