3

以下代码产生 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 3after line 5,它运行良好。这里的顺序有什么关系?类的实例化不应该每次都设置 iVar 值吗?

4

5 回答 5

3

在第 3 行创建对象时,该类尚未完成初始化,并且该have_instance变量具有其默认值null. 这个值是赋给inst_Avail对象的成员变量的,所以方法中返回的值instance.isInstAvail()就是.mainnull

解决此问题的一种简单方法是交换第 3 行和第 4 行,因此have_instance在创建对象时已经有了一个值。或者您可以声明have_instanceasboolean而不是Boolean,因此它将具有值false而不是null。这将使程序不打印任何内容。

或者,也许您可​​以重新考虑您要做什么。在类完成初始化之前创建类的实例很少是一个好主意,特别是如果类不是“最终的”(即可能有子类)。

于 2013-07-07T10:42:57.153 回答
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_Availnull

一些读物:

于 2013-07-07T10:53:38.210 回答
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
    }

}
于 2013-07-07T11:06:09.670 回答
0

另一个解决方案是将 inst_Avail 设为静态,以便在加载类时实例化此变量:

 private static  Boolean inst_Avail=have_Instance;
于 2013-07-07T10:45:35.973 回答
0

您正在将static变量值分配给non-static变量

IE

Boolean inst_Avail=have_Instance;

要么成功static要么

分配inst_Avail = trueconstructor

于 2013-07-07T10:47:10.357 回答