Java Slick2D 线构造函数抛出 NullPointerException
Java Slick2D Line Constructor throws NullPointerException
在 Java Slick2D 中,我正在尝试使用采用两个浮点数组的构造函数制作一条线,详情如下:http://slick.ninjacave.com/javadoc/org/newdawn/slick/geom/Line.html
我的代码如下:
float[] floatArray1 = { 10.0f, 155.0f };
float[] floatArray2 = { 20.0f, 165.0f };
Line line1 = new Line ( floatArray1, floatArray2 );
但是,第三行(我的代码中的第 263 行)抛出 NullPointerException:
java.lang.NullPointerException
at org.newdawn.slick.geom.Line.set(Line.java:217)
at org.newdawn.slick.geom.Line.set(Line.java:138)
at org.newdawn.slick.geom.Line.<init>(Line.java:112)
at view.play.Character.checkIntersectionMovementVector(Character.java:263) (my method)
为什么会这样?
编辑:值得注意的是,使用其构造函数采用四个浮点值而不是两个长度为 2 的浮点数组,并且不会抛出异常:
Line line = new Line ( 10.0f, 155.0f, 20.0f, 165.0f );
看起来像是 Line
class 中的错误。最终调用的Line.set()
方法是这样的:
public void set(float sx, float sy, float ex, float ey) {
super.pointsDirty = true;
start.set(sx, sy); // this is line 217
end.set(ex, ey);
float dx = (ex - sx);
float dy = (ey - sy);
vec.set(dx,dy);
lenSquared = (dx * dx) + (dy * dy);
}
但是,Line
class 的 start
实例变量未在您调用的构造函数中初始化:
public Line(float[] start, float[] end) {
super();
set(start, end); // line 112
}
您应该将错误报告给 Slick2d 维护者。作为解决方法,您应该能够使用 Vector2f
输入构造函数:
public Line(Vector2f start, Vector2f end)
由于这里使用的set()
方法确实初始化start
:
public void set(Vector2f start, Vector2f end) {
super.pointsDirty = true;
if (this.start == null) {
this.start = new Vector2f();
}
this.start.set(start);
if (this.end == null) {
this.end = new Vector2f();
}
this.end.set(end);
vec = new Vector2f(end);
vec.sub(start);
lenSquared = vec.lengthSquared();
}
四浮点输入构造函数也可以工作,因为它调用了上面的 Vector2f
构造函数:
public Line(float x1, float y1, float x2, float y2) {
this(new Vector2f(x1, y1), new Vector2f(x2, y2));
}
在 Java Slick2D 中,我正在尝试使用采用两个浮点数组的构造函数制作一条线,详情如下:http://slick.ninjacave.com/javadoc/org/newdawn/slick/geom/Line.html
我的代码如下:
float[] floatArray1 = { 10.0f, 155.0f };
float[] floatArray2 = { 20.0f, 165.0f };
Line line1 = new Line ( floatArray1, floatArray2 );
但是,第三行(我的代码中的第 263 行)抛出 NullPointerException:
java.lang.NullPointerException
at org.newdawn.slick.geom.Line.set(Line.java:217)
at org.newdawn.slick.geom.Line.set(Line.java:138)
at org.newdawn.slick.geom.Line.<init>(Line.java:112)
at view.play.Character.checkIntersectionMovementVector(Character.java:263) (my method)
为什么会这样?
编辑:值得注意的是,使用其构造函数采用四个浮点值而不是两个长度为 2 的浮点数组,并且不会抛出异常:
Line line = new Line ( 10.0f, 155.0f, 20.0f, 165.0f );
看起来像是 Line
class 中的错误。最终调用的Line.set()
方法是这样的:
public void set(float sx, float sy, float ex, float ey) {
super.pointsDirty = true;
start.set(sx, sy); // this is line 217
end.set(ex, ey);
float dx = (ex - sx);
float dy = (ey - sy);
vec.set(dx,dy);
lenSquared = (dx * dx) + (dy * dy);
}
但是,Line
class 的 start
实例变量未在您调用的构造函数中初始化:
public Line(float[] start, float[] end) {
super();
set(start, end); // line 112
}
您应该将错误报告给 Slick2d 维护者。作为解决方法,您应该能够使用 Vector2f
输入构造函数:
public Line(Vector2f start, Vector2f end)
由于这里使用的set()
方法确实初始化start
:
public void set(Vector2f start, Vector2f end) {
super.pointsDirty = true;
if (this.start == null) {
this.start = new Vector2f();
}
this.start.set(start);
if (this.end == null) {
this.end = new Vector2f();
}
this.end.set(end);
vec = new Vector2f(end);
vec.sub(start);
lenSquared = vec.lengthSquared();
}
四浮点输入构造函数也可以工作,因为它调用了上面的 Vector2f
构造函数:
public Line(float x1, float y1, float x2, float y2) {
this(new Vector2f(x1, y1), new Vector2f(x2, y2));
}