我最近在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);
} }
现在当我在构造函数之前移动对象的创建时,即我在一行中创建它,然后一切正常。
任何人都可以向我解释为什么会发生这种情况,以及我对代码的理解是错误的吗?
提前致谢。
答案 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());
}
}