2013-12-16 2 views
0

я создаю лабиринт генератор в качестве побочного проекта для удовольствия, и я бегу на вопрос, гдеМой код возвращает нуль-то, я понятия не имею, почему

newTile.getxCoord() 

создающей исключения нулевого указателя, и я понятия не имею, почему. Я проверил, чтобы создание моей «плитки» использовало положительные значения, которые существуют в пределах моей доски.

Ссылка на метод и код в целом https://github.com/Dibes/Maze/blob/master/src/MazeCreation/DepthFirst.java#L30.

Для быстрой ходьбы через мой мыслительный процесс для этого кода

// Set the starting tile as visited and current 
    TileGenerator.setTileVisible(Maze.startingTile.getxCoord(), Maze.startingTile.getyCoord(), 0); 
// Set the starting tile as the current tile 
    TileGenerator.setTileCurrent(Maze.startingTile.getxCoord(), Maze.startingTile.getyCoord(), 1); 
    // Set the last tile as the starting tile 
    Tile lastTile = Maze.startingTile; 
    // Grab a new tile that is within the bounds of the map and is greater than 0 
    Tile newTile = TileGenerator.getTile(Utility.getHorizNext(lastTile.getxCoord(), -1, 1), Utility.getVertNext(lastTile.getyCoord(), -1, 1)); 
    while(!TileGenerator.isTilesVisited()) { 
     // Debug testing 
     if (newTile.getxCoord() < 0 || newTile.getyCoord() < 0) { 
      System.out.println(newTile.getxCoord() + " " + newTile.getyCoord()); 
     } 
     // Set the current tile visible 
     TileGenerator.setTileVisible(newTile.getxCoord(), newTile.getyCoord(), 0); 
     // Set the last tile marked as not current 
     TileGenerator.setTileCurrent(lastTile.getxCoord(), lastTile.getyCoord(), 0); 
     // Set the newly found tile marked as current (shows up as red on the board) 
     TileGenerator.setTileCurrent(newTile.getxCoord(), newTile.getyCoord(), 1); 
     // Grab new tile 
     lastTile = newTile; 
     newTile = TileGenerator.getTile(Utility.getHorizNext(lastTile.getxCoord(), -1, 1), Utility.getVertNext(lastTile.getyCoord(), -1, 1)); 
     // A sleep in the thread so i could see the generation slowly 
     try { 
      Thread.sleep(200); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

Извините за то, что коротко, я просто не уверен, почему это было бы создать нулевой указатель.

+0

Пожалуйста, разместите соответствующий код вместо публикации ссылки. – rgettman

+1

Либо 'newTile' равно null, либо что-то под' getxCoord() 'равно null. Посмотрите на свою трассировку стека, чтобы определить, какой из них. – pamphlet

+0

Вы не проверяете, возвращает ли 'getTile' значение NULL. Вы уверены, что это не может потерпеть неудачу? – usr2564301

ответ

2

newTile создается TileGenerator.getTile() - Согласно источнику для TileGenerator, этот метод может возвращать нулевой экземпляр:

https://github.com/Dibes/Maze/blob/master/src/Components/TileGenerator.java#L78

public static Tile getTile(int xCoord, int yCoord) { 
    for (int[] tile : mapTiles) { 
     if (tile[Tile.XCOORD] == xCoord && tile[Tile.YCOORD] == yCoord) { 
      return new Tile(tile[Tile.XCOORD], tile[Tile.YCOORD], tile[Tile.XLOC], tile[Tile.YLOC], tile[Tile.ISFILLED], tile[Tile.ISVISITED], tile[Tile.ISCURRENT]); 
     } 
    } 
    return null; 
} 

Ваш код производит NullPointerException, потому что плитка является нулевым - есть вы написали единичный тест, который охватывает случай, с которым вы работаете?

+0

Именно это и было проблемой! Благодаря! Я скоро поставлю его в качестве ответа – Dibesjr

+1

Что еще важнее, чем найти ошибку, это значит, что в будущем это не повторится с хорошим набором модульных тестов. Вы также можете вернуться к методу 'getTile' в' TileGenerator'. Имеет ли смысл возвращать значение «null» в качестве резервного значения? Может ли здесь возникнуть исключение? – matt

+0

Я думаю, что null имеет смысл в этом случае просто потому, что он не может достичь плитки в этой точке, поэтому плитка равна нулю. Если я выдаю исключение, он прерывает поток программы, где я бы скорее просто продолжал и исправлял координаты, а не останавливал ее полностью. Но я согласен с тем, что я должен больше подумать, когда дело доходит до остальной части программы! – Dibesjr

Смежные вопросы