Получение ошибки исключения нулевой точки java.lang при обработке

1

Я получаю исключение java.lang nullpointer в моем проекте обработки, я думаю, что это имеет какое-то отношение к cDistance, но я не совсем уверен. Я переместил некоторые вещи вокруг и все еще получаю эту ошибку. Если у кого-то есть представление о том, где я поступил неправильно, это было бы очень признательно.

 class Ball {
  int xpos, ypos;
  int ballDiam;
  color myColor;
  boolean visible = true;
  Ball(int tempdiam, color tempColor) {
    ballDiam=tempdiam;
    myColor=tempColor;
  }

  void update() {
    if (visible) {
      fill(myColor);
      ellipse(xpos, ypos, ballDiam, ballDiam);
    }
  }
} 

Ball hole, gball;//declare a ball object for the golfball and the hole 
float cDistance = dist(gball.xpos, gball.ypos, hole.xpos, hole.ypos);
int click;//to keep track of clicks
String msg;
int steps = 20;
int difx, dify;
Boolean moving = false;
void setup() {
  msg=""; 
  click=0;
  size(800, 400); 
  hole= new Ball(50, #000000);//making the 
  gball = new Ball(35, #ffffff);
} 
void draw() { 
  background(#009900);
  println("the click count is "+click);
  //set the hole ball as a golf hole right in the middle of the green
  hole.xpos = width/2;
  hole.ypos = height/2;
  hole.update();
  if (click==0) {
    //when no click has happened make the gball ball follow the mouse, 
    //after the click the ball will stay at the last position 
    gball.xpos=mouseX;
    gball.ypos=mouseY;
    msg="please place the golf ball";
  }
  else if (click==1) {//prompt the user to click again to shoot
    msg="now click again to shoot";
    difx = gball.xpos-hole.xpos;
    dify = gball.ypos-hole.ypos;
  }
  else if (click==2) {
    cDistance = dist(gball.xpos, gball.ypos, hole.xpos, hole.ypos);
    if (cDistance>hole.ballDiam/2) {
      moving = true;
      gball.xpos-=difx/steps;
      gball.ypos-=dify/steps;
      gball.xpos+=5;
    }
    else {
      moving = false;
      gball.visible=false;
      click=3;
    }
  }
  gball.update();
  textSize(20);
  text(msg, 0, height-5);
}

void mouseClicked() {
  if (!moving) {
    click++;
  }
}

Стек:

java.lang.RuntimeException: java.lang.NullPointerException
    at processing.core.PApplet.runSketch(PApplet.java:10573)
    at processing.core.PApplet.main(PApplet.java:10377)
Caused by: java.lang.NullPointerException
    at sketch_140421a.<init>(sketch_140421a.java:37)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)
    at processing.core.PApplet.runSketch(PApplet.java:10571)
    ... 1 more
  • 2
    Сейчас самое время узнать, как использовать отладчик вашей IDE. Вы не говорите нам, какая строка вызвала ошибку. Мы должны угадать?
  • 0
    Интересно, как Ball вызывает ellipse , но я не вижу ни одного объявления метода ...
Показать ещё 2 комментария
Теги:
runtime-error
nullpointerexception
processing

2 ответа

0

Ball # update() вызывает Ball # eclipse(), который не был объявлен и поэтому является нулевым. Вы также объявляете отверстие и гальбу типа Ball, но никогда не инициализируете их новым Ball(). Я предлагаю вам использовать IDE, такую как Eclipse или IntelliJ, они делают тривиальные ошибки, такие как это намного легче избавиться. Кроме того, в следующий раз опубликуйте stacktrace.

  • 0
    Метод обновления объявлен в классе Ball, взгляните ;-) также (возможно, я слепой) в коде нет метода "eclipse", вызываемого где-либо в коде.
  • 0
    Извините, я имел в виду эллипс, четырнадцатую линию вниз. Насчет декларации я пропустил. Другое дело, что лучше использовать boolean, чем Boolean, и любые примитивы над обернутыми классами примитивов, поскольку это позволяет избежать создания ненужного объекта.
0

Ваши шары объявляются, но не инициализируются здесь:

Ball hole, gball;//declare a ball object for the golfball and the hole 
float cDistance = dist(gball.xpos, gball.ypos, hole.xpos, hole.ypos);

=== NPE

Вы shoul инициализируете шары сначала с некоторыми значениями, что-то вроде:

gball = new Ball();
hole = new Ball();

На самом деле вам может понадобиться конструктор для Ball, который также устанавливает некоторые значения в xpos/ypos или просто устанавливает некоторые значения по умолчанию, например:

class Ball {
   int xpos = 0;
   int ypos = 0;
   //...
  • 0
    Извините за очень новую обработку и кодирование в целом, их нужно инициализировать дважды? Я думал, что я сделал это в void setup () ;?
  • 0
    Вы можете сделать это в методе установки, который хорошо. Проблема в следующем: float cDistance = dist(gball.xpos, gball.ypos, hole.xpos, hole.ypos); который выполняется перед методом установки, потому что это объявление поля с начальным значением. В качестве альтернативы вы можете просто объявить float cDistance; и во время настройки () присвойте ему значение после инициализации Balls.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню