Вызов метода из массива класса дает исключение NullPointerException - PullRequest
0 голосов
/ 26 января 2012

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

Проблема : Когда я пытаюсь вызвать метод построения платформы, отправив нужные мне параметры, она дает мне NullPointerException. Метод работал раньше, но со всем статичным, поэтому я не мог иметь несколько экземпляров этого класса, и теперь я удалил статические поля из класса платформы, и он дает мне NullPointerException каждый раз, когда я вызываю метод.

Я скопировал часть кода, которая дает мне ошибку, ошибка идет следующим образом:

public static void main(String[] args) {
        Game ex = new Game();
        new Thread(ex).start();
    }

В игровом классе:

public Load_Stage load = new Load_Stage();
public Game() {
        -other variables initializatin-
        Initialize_Items();
        load.Stage_1(); // <--- problem this way

В классе Load_Stage:

public class Load_Stage {
    public Platforms plat = new Platforms();

    public void Stage_1(){    
        Stage_Builder.Build_Platform(200, 500, 300, plat.platform1);
        Stage_Builder.Build_Platform(100, 200, 100, plat.platform1);
    }

}

А внутри класса Stage_Builder:

public class Stage_Builder {

    public static final int max_platforms = 10;
    public static Platform_1[] p1 = new Platform_1[max_platforms];
    public static boolean[] platform_on = new boolean[max_platforms];    

    public Stage_Builder() {
        for (int c = 0; c < platform_on.length; c++) {
            platform_on[c] = false;
        }
    }
    public static void Build_Platform(int x, int y, int width, ImageIcon[] type) { // BUILDS A PLATFORM

        for (int b = 0; b < max_platforms; b++) {
            if (platform_on[b] == false) { 
                p1[b].Construct(x, y, width, type); // <-- NullPointerException here
                platform_on[b] = true; 
                break;
            }
        }
    }
}

Заранее спасибо.

РЕДАКТИРОВАТЬ: Вот класс Platform_1 (извините, что забыл об этом):

public class Platform_1 {

    private int platform_begin_width = 30;
    private int platform_middle_width = 20;
    public int blocks_number = 0;
    public ImageIcon[] platform_floors = new ImageIcon[500];
    private int current_width = 0;
    public int [] platform_x = new int [500];
    public int platform_y = 0;
    public int platform_width = 0;

    public void Construct(int x, int y, int width, ImageIcon [] type) {        
        platform_width = width;
        platform_y = y;
        for (int c = 0; current_width <= platform_width; c++) { 
            if (c == 0) {
                platform_x[c] = x;
                platform_floors[c] = type[0];
                current_width += platform_begin_width;
            } else if ((current_width + platform_middle_width) > platform_width) {
                platform_floors[c] = type[2];
                blocks_number = c + 1;
                platform_x[c] = current_width + x;
                current_width += platform_middle_width;
            } else {
                platform_floors[c] = type[1];
                platform_x[c] = current_width + x;
                current_width += platform_middle_width;
            }
        }        
    }
}

И Платформы класса:

public class Platforms {

    public ImageIcon[] platform1 = {new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/begin.png"),
        new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/middle.png"),
        new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/end.png")};
}

Ответы [ 4 ]

3 голосов
/ 26 января 2012

Проблема и решение очевидны.

public static Platform_1[] p1 = new Platform_1[max_platforms];

После выполнения этой строки кода p1 представляет собой массив ссылок типа Platform_1 , которые все имеют значение null .

Выполнение этой строки кода сразу говорит вам:

            p1[b].Construct(x, y, width, type); // <-- NullPointerException here

Решение состоит в том, чтобы инициализировать массив p1, чтобы указывать на ненулевые экземпляры Platform_1.

Примерно так будет работать:

for (int i = 0; < p1.length; ++i) {
    p1[i] = new Platform1();
}
2 голосов
/ 26 января 2012

Я не вижу, куда вы помещаете вещи в массив p1 в классе Stage_Builder.

Другая возможность (маловероятная, но возможная, если вы не все показали) состоит в том, что что-то в классе Platform, которое вы не показывали, не инициализируется и ломается при вызове Construct.

Кроме того, следующее кажется проблематичным

public static Platform_1[] p1 = new Platform_1[max_platforms];
public static boolean[] platform_on = new boolean[max_platforms];    

public Stage_Builder() {
   for (int c = 0; c < platform_on.length; c++) {
       platform_on[c] = false;
   }
}

похоже, вы объявляете статические переменные p1 и platform_on, но вы просто заполняете platform_on в конструкторе. Таким образом, когда вы в первый раз создаете экземпляр Stage_Builder, вы заполняете один статический массив всеми false и ничего не помещаете в другой статический массив ...

Заполнить эти статические переменные в статическом блоке

// static var declarations

static {
   // populate static arrays here.
}
0 голосов
/ 26 января 2012

Прежде всего, ваша проблема в том, что p1 [b], скорее всего, равно нулю, как указывал Даффимо.

Во-вторых, вы используете массивы очень странным образом. Как насчет

а) удалить Stage_Builder

б) Вместо этого где-нибудь есть ArrayList

c) Эквивалент Build_Platform1 () выглядит следующим образом:

p1.add(new Platform1(x, y, width, type);

d) нет, если на [i], нет max_platforms, нет цикла for для добавления платформы (последнее является проблемой плохой производительности, если у вас на самом деле несколько платформ Hundret)

0 голосов
/ 26 января 2012

Массив, по которому вы вызываете сообщение, никогда не был заполнен.

У вас есть

public static Platform_1[] p1 = new Platform_1[max_platforms];

, поэтому p1 равно

p1[0] = null
p1[1] = null
 .
 .
 .
p1[max_platforms] = null

Вы пытаетесь вызвать

p1[b].Construct(x, y, width, type);

, что

null.Construct(...);

Вам необходимо сначала инициализировать этот индекс в массиве.

p1[b] = new Platform_1();
p1[b].Construct(...);
...