Eclipse предлагает исключение Null Pointer, хотя я считаю, что инициализировал свой объект

Как видно из названия, у меня ошибка NPE. Это происходит онлайн:

while (getWidth() > bowl.getX()+10) {

Если я удаляю это, это показывает, что это происходит в следующей строке:

bowl.move(10.0, 0);

Я пришел к выводу, что затмение не видит мою "чашу" инициализирован. Зачем? Разве "новый GOval" не справляется с этим? Я видел в одном из потоков здесь, что решение было разделить объявление и инициализацию на разные строки, но я думаю, что это вряд ли будет основным решением (кроме того, это не помогло в моем случае). Любые предложения на этот счет код?

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

import acm.program.*;
import acm.graphics.*;
import java.awt.event.*;

public class animation extends GraphicsProgram {

public void init() {
    GOval bowl = new GOval(10,10);
    add(bowl);
    addMouseListeners();
}


public void mouseClicked(MouseEvent e) {
        while (getWidth() > bowl.getX()+10) {
        bowl.move(10.0, 0);
        pause(50);
    }
}

private GOval bowl; 
}

3 ответа

Решение

Линия:

GOval bowl = new GOval(10,10);

объявляет новый GOval и скрывает глобальный GOval, определенный внизу.

Эта строка должна быть просто:

bowl = new GOval(10,10);

Вы следите за своим bowl поле на уровне класса в init метод,

private GOval bowl; 

public void init() {
  // GOval bowl = new GOval(10,10);
  bowl = new GOval(10,10);
  add(bowl);
  addMouseListeners();
}

Как и большинство людей, которые уже упоминали, вы отслеживаете переменную чаши.

GOval bowl = new GOval(10,10);

следует заменить на

bowl = new GOval(10,10);

Вы можете настроить Eclipse, чтобы он предупреждал вас, когда вы делаете это. В настройках у вас есть отдельная часть для этого в Java -> компилятор -> ошибки / предупреждения

Другие вопросы по тегам