以下代码生成NullPointerException -
public class MyClass {
static MyClass instance= new MyClass(); // line 3
static Boolean have_Instance = true;
Boolean inst_Avail=have_Instance; // line 5
Boolean isInstAvail(){
return inst_Avail;
}
public static void main(String[] args) {
System.out.println(instance.isInstAvail() ? "Instance is there.":""); // gives java.lang.NullPointerException
}
}
如果我将line 3
移到line 5
之后,它运行正常。订单如何在这里重要?不应该每次实例化一个类设置iVar值吗?
答案 0 :(得分:3)
在第3行创建对象时,该类尚未完成初始化,have_instance
变量的默认值为null
。此值已分配给对象的inst_Avail
成员变量,因此instance.isInstAvail()
方法中main
返回的值将为null
。
解决这个问题的一种简单方法是交换第3行和第4行,因此have_instance
在创建对象时已经有了一个值。或者您可以将have_instance
声明为boolean
而不是Boolean
,因此它的值为false
而不是null
。这会使程序打印出来。
或许你可以重新思考你想要做的事情。在类初始化之前创建类的实例很少是个好主意,特别是如果类不是“最终”(即可能有子类)。
答案 1 :(得分:2)
如果通过设置值或使用静态初始化程序块直接初始化这些字段,则字段顺序很重要。它们按顺序执行。所以你无法做前瞻性参考:
private int someInt = 10 + otherInt;
private int otherInt = 22;
这不会起作用,因为字段是按照文本声明的顺序初始化的。如果你有两个静态初始值设定项,它们也将按顺序执行:
static { System.out.println("first"); }
static { System.out.println("second"); }
因此,在您的情况下,您在instance
之前初始化have_instance
,因此后者仍为null
(非基元的默认值)。 JVM将创建一个MyClass
对象以分配给instance
并初始化其字段,即将have_instance
的值分配给inst_Avail
,该值将设置为null
也是。
有些读数:
答案 2 :(得分:1)
这段代码真的很奇怪,我没有看到用例,但是这样可以解决这个问题:
public class MyClass {
static MyClass instance; // line 3
static Boolean have_Instance = true;
Boolean inst_Avail=have_Instance; // line 5
Boolean isInstAvail(){
return inst_Avail;
}
public static void main(String[] args) {
instance = new MyClass();
System.out.println(instance.isInstAvail() ? "Instance is there.":""); // gives java.lang.NullPointerException
}
}
答案 3 :(得分:0)
另一个解决方法是将inst_Avail设置为静态,以便在加载类时,实例化此变量:
private static Boolean inst_Avail=have_Instance;
答案 4 :(得分:0)
您要将static
变量值分配给non-static
变量
即。
Boolean inst_Avail=have_Instance;
将其设为static
或
在inst_Avail = true
constructor