-1

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

谢谢,

缺口。

编辑:

航点类:

    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;
}
4

3 回答 3

1

您似乎没有position在构造函数中初始化该字段,然后尝试打印它。所以抛出异常。

编辑:

是什么waypoints?取决于它Panel.waypoints.get(0)可能会导致从航点中删除该点,从而在您第二次尝试访问它时导致 NPE。

于 2013-11-02T02:50:01.600 回答
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值用于表示某些无效操作的结果,例如除以 float 和 double 类型的常量,预定义zero 为 和。因此,请检查您在哪里对它们执行任何无效操作。zero. NaNFloat.NaNDouble.NaN

于 2013-11-02T03:11:40.000 回答
0

NaN在您的代码或输出中没有提到任何地方。

你得到一个NullPointerException因为positionnull(你从未初始化它)。

于 2013-11-02T02:45:39.357 回答