Ошибка геттера в Java - PullRequest
       12

Ошибка геттера в Java

2 голосов
/ 22 декабря 2011

Я начал заниматься Java этим летом и в свободное время создаю небольшую игру. У меня сейчас проблема с геттером. В классе Player у меня есть получатель целого числа "speed".

Вот код:

public int getSpeed(){
    return this.speed;
}

Это целое число "speed" установлено в конструкторе:

public Player(int x, int y, String n, BufferedImage s, int spd) {
    super(x, y);
    this.name = n;
    this.sprite = s;
    spd = this.speed;
    this.l_x = x;
    this.l_y = y;
}

Когда я пытаюсь использовать переменную "speed" в коде движения:

if (w) {
    p_y -= player.getSpeed();
}

Я получаю эту ошибку во время выполнения (спасибо Martijn Courteaux):

Exception in thread "Thread-3" java.lang.NullPointerException
    at main.gameMain.update(gameMain.java:81)

Где строка 81 - строка, на которой появляется код движения.

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

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

РЕДАКТИРОВАТЬ: я изменил

spd = this.speed;

до

this.speed = spd;

но я все еще получаю ошибку исключения нулевого указателя. Фактически любая переменная, которую я пытаюсь использовать из бросков, выдает ту же ошибку.

Кто-нибудь может увидеть какие-либо серьезные ошибки? И спасибо всем, кто помог до сих пор! Я очень ценю это!

основной пакет;

import java.awt.image.BufferedImage;

публичный класс Player расширяет персонаж {

private String name;
private BufferedImage sprite;
private int speed, l_x, l_y;

public Player(int x, int y, String n, BufferedImage s, int spd) {
    super(x, y);
    this.name = n;
    this.sprite = s;
    speed = spd;
    this.l_x = x;
    this.l_y = y;
}

public int getSpeed(){
    return this.speed;
}

public void setSpeed(int i){
    this.speed = i;
}

public int getOriginalX(){
    return super.o_loc_x;
}

public int getOringinalY(){
    return super.o_loc_y;
}

public int getCurrentY(){
    return this.l_y;
}

public int getCurrentX(){
    return this.l_x;
}

public void setCurrentY(int i){
    i = this.l_y;
}

public void setCurrentX(int i){
    i = this.l_x;
}

public void moveUp(){
    this.l_y -= speed;
}

public void moveDown(){
    this.l_y += speed;
}

public void moveLeft(){
    this.l_x -= speed;
}

public void moveRight(){
    this.l_x += speed;
}

public void setName(String input){
    this.name = input;
}

public String getName(){
    return this.name;
}

public void setSprite(BufferedImage m){
    this.sprite = m;
}

public BufferedImage getSprite(){
    return this.sprite;
}

}

РЕДАКТИРОВАТЬ: Я такой идиот. Когда я объявлял новый экземпляр Player, я помещал

Игрок игрока = ...

Вместо:

player = ....

Ответы [ 5 ]

1 голос
/ 22 декабря 2011

Изменение:

spd = this.speed;

С:

this.speed = spd;
0 голосов
/ 22 декабря 2011

NullPointerException находится в вашем классе gameMain, поэтому нам нужно увидеть это, чтобы понять, в чем может быть проблема.

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

0 голосов
/ 22 декабря 2011

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

Убедитесь, что ваши поля, которые не изменяются (значения для базовых типов и ссылки для всех остальных), установлены в final, и выполучит явную ошибку компилятора, если вы забудете установить их во время сборки.Если у вас есть только «конечные» поля, ваш класс будет неизменным (см. «Эффективная Java» Джошуа Блоха, чтобы узнать, как использовать неизменяемые классы).Но скорость, вероятно, меняется, когда вы запускаете приложение, так что это не будет работать для этого конкретного поля.Я продемонстрирую это имя.

Так что это будет:

private final String name;
private int speed;

public Player(final String n, final int spd) {
    spd = this.speed; // cannot assign, it's final
    // whoops, another error, forgot to assign a value to the name field
}
0 голосов
/ 22 декабря 2011

Вот ваша проблема:

spd = this.speed;

Вы хотите

this.speed = spd;

В Java (и в большинстве других языков программирования) назначаемая переменная должна быть слева, а не справа.

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

0 голосов
/ 22 декабря 2011

изменить:

`spd = this.speed;`

на:

`speed = spd;`
...