Я получаю исключение 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
Ball # update() вызывает Ball # eclipse(), который не был объявлен и поэтому является нулевым. Вы также объявляете отверстие и гальбу типа Ball, но никогда не инициализируете их новым Ball(). Я предлагаю вам использовать IDE, такую как Eclipse или IntelliJ, они делают тривиальные ошибки, такие как это намного легче избавиться. Кроме того, в следующий раз опубликуйте stacktrace.
Ваши шары объявляются, но не инициализируются здесь:
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;
//...
float cDistance = dist(gball.xpos, gball.ypos, hole.xpos, hole.ypos);
который выполняется перед методом установки, потому что это объявление поля с начальным значением. В качестве альтернативы вы можете просто объявить float cDistance;
и во время настройки () присвойте ему значение после инициализации Balls.
Ball
вызываетellipse
, но я не вижу ни одного объявления метода ...