在Java中解析空指针异常时遇到问题

在Java中解析空指针异常时遇到问题,java,pointers,nullpointerexception,Java,Pointers,Nullpointerexception,编辑我正在添加源代码的粘贴箱,以便更容易地查看我的代码。 启动类[ 机器人[ 敌人[ 我是一个新的Java程序员,刚刚遇到了他的第一个空指针异常。我在我的类中进行了一次白费力气的搜索,但什么也没找到 我正在学习Kilobolt的Java游戏开发教程(),到此为止。不幸的是,我在游戏的敌人类的更新函数中遇到了一个空指针异常。如果需要,我可以发布完整的源代码,但以下是我认为最相关的片段。 空指针来自 } else if (Math.abs(robot.getCenterX() - centerX)

编辑我正在添加源代码的粘贴箱,以便更容易地查看我的代码。 启动类[
机器人[
敌人[

我是一个新的Java程序员,刚刚遇到了他的第一个空指针异常。我在我的类中进行了一次白费力气的搜索,但什么也没找到

我正在学习Kilobolt的Java游戏开发教程(),到此为止。不幸的是,我在游戏的敌人类的更新函数中遇到了一个空指针异常。如果需要,我可以发布完整的源代码,但以下是我认为最相关的片段。
空指针来自

} else if (Math.abs(robot.getCenterX() - centerX) < 5) {
StartingClass中对应的函数为:

public static Robot getRobot() {
    return robot;
}
机器人定义为:

private static Robot robot;
我可以看出robot在StartingClass中不是空的,因为我可以调用同一个getter函数并打印结果。我不明白为什么它没有通过getter函数执行


谢谢。

检查Robot中的CenterX变量是否在使用前启动。

要理解这些片段的情况很复杂。 但是分析情况

我假设你有一门课

class  static StartingClass{

    private static Robot robot;

    public static Robot getRobot() {
        return robot;
    }

}
在某个班级里

class someClass{
    someMethod(){
//Business logic
        if{
//Business logic x2
        }else if (Math.abs(robot.getCenterX() - centerX) < 5) { //NULLPOINTER

        }
    }
}

首先,我们注意到,在两个不同的类中有两个名为
robot
的不同字段。一个静态字段位于class
StartingClass
中,另一个非静态字段位于class
X

现在,由于X类中的robot字段定义如下:

private Robot robot = StartingClass.getRobot();
从类X创建新对象时,会立即调用
StartingClass.getRobot()
。因此,在从类X创建新对象之前,必须初始化
StartingClass
中的robot字段

您可以在
StartingClass
中初始化robot firld,如下所示:

public static void init() {
    try {
        robot = new Robot();
    } catch (AWTException ex) {
        System.err.println("Error");
    }
}
你说:“我可以告诉robot在StartingClass中不是null,因为我可以调用相同的getter函数并打印出结果。”

我不知道你所说的“打印结果”是什么意思。你判断一个引用不是空的方法是通过实际输入一个空检查,我认为你没有这样做

你说你“定义”了机器人:

private static Robot robot;
但是请注意robot为null。此时它只是一个名称/句柄。它实际上还没有引用对象。因此,在将对象分配给“robot”之前,调用getter只会返回null

我看了一眼敌人的职业,看起来代码总是这样

private static Robot robot = GameScreen.getRobot();

只要右侧返回一个机器人对象,“Robot”将引用实际对象。似乎您可能无意中删除了该部分。

我认为Java根本不使用指针?!!!@KickButtowski Java确实有指针,但它们都是内部的,由JVM管理。您无法在代码中显式地使用它们,但它们在运行时会跟上对象。不过,您可以创建refe对象的重复。通常,
NullPointerException
s发生是因为您引用了一个非轴对象。在代码初始化它们之前,所有字段都为null。显然,
StartingClass.robot
开始时为null。您的另一个类似乎正在调用StartingClass.getRobot()在开始之前,类实际上已经将自己的
robot
字段设置为非空值。如果您包括来自StartingClass的初始化robot字段的代码,我们可以为您提供更多帮助。不要使用Pastebin;只需将代码放在这里。如果您将其缩减到出现故障的特定组件,这样就不会有太多错误,这也会有所帮助它是(private int centerX=100;)并且100是我从StartingClass打印getCenterX()时看到的相同值。我认为您将得到另一种类型的执行,就像您不能在null对象上执行减号操作一样,而不是空指针(至少在groovy上通常我会得到)当我尝试捕获导致错误的代码时,它抛出了一个nullpointerexception。我从来没有用groovy编写过代码,所以我不能说它是否与Java类似。这是Java。
robot&&
不会编译。执行null检查将避免nullpointerexception,但它不会使事情按预期工作。是的,你是对的,我实际上,我是在groovy上编程的。是的,我想是这样,但可能方法是在创建机器人之前执行的,这是真正的问题,因此检查机器人是否存在可能是一个不错的选择。我又添加了一个选项,与第一个选项非常相似,但避免执行所有逻辑。添加机器人!=null修复了问题。比k你!
private Robot robot = StartingClass.getRobot();
public static void init() {
    try {
        robot = new Robot();
    } catch (AWTException ex) {
        System.err.println("Error");
    }
}
private static Robot robot;
private static Robot robot = GameScreen.getRobot();