2016-12-20 3 views
-4

Я использую LibGDX для создания игры для Android. Я получаю исключение нулевого указателя в этом классе, но я не знаю, почему (отметьте комментарии).Java - Исключение нулевого указателя при вызове метода

public class ScoreFont { 
    private Texture _numbers[]; 
    private int _number; 

    public ScoreFont(){ 
     //Load font 
     for(int i = 0; i <= 9; i++){ 
      _numbers = new Texture[10]; 
      _numbers[i] = new Texture("font_"+i+".png"); 
      /*the line above works fine. if I use if(_number[i] != null) System.out.println("loaded"); it will print*/ 

     } 
     _number = 0; 
    } 

    public void setNumber(int number){ 
     _number = number; 
    } 

    public void draw(SpriteBatch sb, float x, float y, float width, float height){ 
     String numberString = Integer.toString(_number); 

     int numDigits = numberString.length(); 
     float totalWidth = width * numDigits; 

     //Draw digits 
     for(int i = 0; i < numDigits; i++){ 
      int digit = Character.getNumericValue(numberString.charAt(i)); 

      /*I get a null pointer exception when this method or the dispose() method are called. The _numbers[digit] == null, or even if I switch it for _numbers[0] it is still null. Why?*/ 
      sb.draw(_numbers[digit], x - totalWidth/2 + i*width, y - height/2, width, height); 
     } 
    } 

    public void dispose(){ 
     //I get null pointer exception 
     for(Texture texture: _numbers){ 
      texture.dispose(); 
     } 
    } 
} 

Что может быть здесь? Конструктор этой функции нужно вызывать всегда перед любым методом, и это гарантирует, что текстуры всегда загружаются правильно? Так почему я получаю исключение нулевого указателя?

Спасибо!

+0

@ John3136 Я знаю, что такое NullPointerException, я просто не могу найти ошибку здесь. Я действительно думаю, что вы должны прочитать весь вопрос, прежде чем предпринимать действия. –

+2

Ваш конструктор. Каждый раз над циклом вы создавали «новую текстуру [10]». Когда цикл выходит, только '_numbers [9]' не будет пустым –

+2

Не важно, что вы знаете, что это такое - debug, set breakpoints. Печать значений. Выясните * почему *. –

ответ

1
_numbers = new Texture[10]; 
_numbers[i] = new Texture("font_"+i+".png"); 

В цикле вы создаете новый массив каждой итерации, это означает, что, когда цикл завершается у вас будет новый массив с только последний элемент инициализируется. Переместить создание массива из цикла.

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