在创建对象JAVA之前,构造函数代码不会执行

时间:2013-03-12 15:14:05

标签: java object constructor execution creation

我最近在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);

}  }

现在当我在构造函数之前移动对象的创建时,即我在一行中创建它,然后一切正常。

任何人都可以向我解释为什么会发生这种情况,以及我对代码的理解是错误的吗?

提前致谢。

5 个答案:

答案 0 :(得分:7)

你永远不会在ObjectA()构造函数中调用ObjectA构造函数,除了。如果你曾经 调用构造函数(例如来自main),那么你会得到一个堆栈溢出,因为你将永远递归。

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

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

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

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

答案 1 :(得分:0)

您需要将ObjectA oa = new ObjectA()移至主要方法。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

把:

ObjectA oa = new ObjectA();
在您的System.out.print之前的主页中

2)将消息设置为public而不是private。

答案 4 :(得分: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());
    }
}