我最近遇到了一个困扰我的问题。我正在将Point2D对象的位置设置为另一个预先存在的Point2D对象。当我将预先存在的点分配给新点时,我得到一个空指针异常。为了更好地解释这一点,我的代码和输出。输出清楚地表明第一个点已初始化并且具有明显空指针之前的值。有谁知道为什么会这样?
代码:
private Point2D position;
public Enemy(Map map, double speed) {
if (Panel.waypoints.size() < 1) {
Panel.waypoints.add(new Waypoint(0, 0));
}
System.out.println(Panel.waypoints.get(0).getPoint());
position.setLocation(Panel.waypoints.get(0).getPoint());//this line throws the NPE
System.out.println(position);
}
控制台:
Point2D.Double[331.0, 284.0]
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at towerdefencev2.Enemy.<init>(Enemy.java:36)
at towerdefencev2.Panel.mouseReleased(Panel.java:72)
at java.awt.Component.processMouseEvent(Component.java:6505)
谢谢,
尼克。
编辑:
Waypoint课程:
int x, y;
Point2D point;
public Waypoint(int x, int y) {
this.x = x;
this.y = y;
point = new Point2D.Double(x, y);
}
Point2D getPoint() {
return point;
}
答案 0 :(得分:1)
您似乎没有在构造函数中初始化字段position
,然后尝试打印它。所以抛出异常。
编辑:
什么是waypoints
?取决于它是什么Panel.waypoints.get(0)
可能会导致在您第二次尝试访问时导致NPE的路点中移除该点。
答案 1 :(得分:1)
System.out.println(Panel.waypoints.get(0).getPoint()); // Point2D.Double[331.0, 284.0]
position.setLocation(Panel.waypoints.get(0).getPoint());
从这两行开始,可以安全地假设该位置未初始化。您无法访问(例如尝试setLocation(Point2D)
或对未初始化的对象执行任何操作(因此,position
)。请使用以下命令对其进行初始化:
Point2D postition = new Point2D.Double(0, 0);
然后你应该可以将它设置到你需要的任何位置。
关于NaN :NaN
值用于表示某些无效操作的结果,例如将zero
除以zero.
NaN
个常量float和double类型都预定义为Float.NaN
和Double.NaN
。因此,请检查您使用它们执行任何无效操作。
答案 2 :(得分:0)
在您的代码或输出中没有提到NaN
。
您收到NullPointerException
,因为position
是null
(您从未对其进行初始化)。