在处理过程中接收到java.lang空指针异常错误

在处理过程中接收到java.lang空指针异常错误,java,nullpointerexception,runtime-error,processing,Java,Nullpointerexception,Runtime Error,Processing,在我的处理项目中,我收到了一个java.lang nullpointer异常,我认为它与cDistance有关,但我不太确定。我移动了一些东西,但仍然会出现这个错误。如果有人知道我哪里出了问题,我将不胜感激 class Ball { int xpos, ypos; int ballDiam; color myColor; boolean visible = true; Ball(int tempdiam, color tempColor) { ballDiam=te

在我的处理项目中,我收到了一个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
java.lang.RuntimeException:java.lang.NullPointerException
运行草图(PApplet.java:10573)
位于processing.core.PApplet.main(PApplet.java:10377)
原因:java.lang.NullPointerException
在草图_140421a处。(草图_140421a.java:37)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于java.lang.Class.newInstance(Class.java:374)
运行草图(PApplet.java:10571)
... 还有一个

您的球在此处声明但从未初始化:

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

您应该首先使用一些值初始化球,例如:

gball = new Ball();
hole = new Ball();
事实上,您可能希望Ball有一个构造函数,它还将一些值设置为xpos/ypos,或者只设置一些默认值,例如:

class Ball {
   int xpos = 0;
   int ypos = 0;
   //...
Ball#update()调用Ball#eclipse(),它尚未声明,因此为null。 您还可以将hole和gball声明为Ball类型,但从不将它们初始化为new Ball()。
我建议您使用诸如Eclipse或IntelliJ之类的IDE,它们使像这样的小错误更容易消除。另外,下次发布stacktrace。

现在是学习如何使用IDE调试器的好时机。你没有告诉我们是哪一行产生了错误。我们应该猜测吗?有趣的是,
Ball
如何调用
eliple
,但我没有看到任何方法声明……这是它逐字给出的错误。我在上面发布了它。
ellipse
方法是由处理框架@RogueThe提供的更新方法是在Ball类中声明的,请看;-)另外(可能我是瞎的)代码中没有调用“eclipse”方法。对不起,我指的是椭圆,第十四行。关于声明,我错过了。另一件事,使用布尔值比使用布尔值更好,因为它避免了创建不必要的对象,所以在包装的基元类上使用任何基元。对不起,一般来说,非常新的处理和编码,它们必须初始化两次吗?我以为我是在void setup()中做的;?您可以在设置方法中这样做,这很好。问题是行:
float cDistance=dist(gball.xpos,gball.ypos,hole.xpos,hole.ypos)在setup方法之前执行,因为它是一个具有初始值的字段声明。您也可以只声明
float cDistance和setup()期间,在初始化球后为其赋值。