0

我最近在java中玩过代码,遇到了这个问题,构造函数中的代码似乎没有被执行,因为编译器抛出了NullPointerException。

public class ObjectA {

protected static ObjectA oa;
private String message = "The message";

public ObjectA() {

    oa = new ObjectA();

}

public static void main(String args[]) {

    System.out.println(oa.message);

}  }

现在,当我将对象的创建移到构造函数之前,即我在一行中完成时,一切正常。

谁能向我解释为什么会发生这种情况,以及我对代码的理解是错误的?

提前致谢。

4

5 回答 5

7

除了在构造函数中ObjectA(),您永远不会调用构造函数。如果你曾经调用过构造函数(例如 from ),你会得到一个堆栈溢出,因为你会永远递归。ObjectAmain

目前还不清楚您要做什么或为什么要使用静态变量,但您的代码会更简单:

public class ObjectA {
    private String message = "The message";

    public static void main(String[] args) {
        ObjectA oa = new ObjectA();
        System.out.println(oa.message);
    }
}

另请注意,编译器从不抛出异常。区分编译时错误(语法错误等)和执行时错误(通常是异常)非常重要。

于 2013-03-12T15:16:25.023 回答
0

您需要转到ObjectA oa = new ObjectA()您的主要方法。

此外,没有必要这样做:protected static ObjectA oa;

你应该从教程中复制/粘贴一个 Hello World 程序,看看它是如何工作的。

于 2013-03-12T15:16:41.653 回答
0

您定义了一个静态变量oa,但您只在类的构造函数中初始化它。您永远不会实例化您的类ObjectA,因此oa只能为空。

当您调用 main 方法时,它会尝试访问message空对象的变量,因此是 NPE。

于 2013-03-12T15:17:57.330 回答
0

1)你永远不会创建一个对象

放:

ObjectA oa = new ObjectA();

在您的 System.out.print 之前的 main 中。

2)将消息设置为公开而不是私有。

于 2013-03-12T15:20:27.500 回答
0

希望你需要这样的东西

public class ObjectA {

    protected static ObjectA oa;
    private String message = "The message";

    public ObjectA() {
    }

    public static ObjectA getInstance() {
        if (oa == null) {
            oa = new ObjectA();
        }
        return oa;
    }

    public String getMessage() {
        return message;
    }

    public static void main(String args[]) {
        System.out.println(ObjectA.getInstance().getMessage());
    }
}
于 2013-03-12T15:21:33.033 回答