Point2D返回NaN / Nullpointer

时间:2013-11-02 02:39:51

标签: java nullpointerexception nan

我最近遇到了一个困扰我的问题。我正在将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;
}

3 个答案:

答案 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.NaNDouble.NaN。因此,请检查您使用它们执行任何无效操作。

答案 2 :(得分:0)

在您的代码或输出中没有提到NaN

您收到NullPointerException,因为positionnull(您从未对其进行初始化)。