繁体   English   中英

初始化对象时,实例变量是否始终未初始化?

[英]When Initializing object, instance variable not initialized always?

以下代码生成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移到line 3 line 5 line 3之后,它运行正常。 订单如何在这里重要? 不应该每次实例化一个类设置iVar值吗?

当在第3行创建对象时,该类尚未完成初始化,并且have_instance变量具有其默认值null 此值分配给对象的inst_Avail成员变量,因此main方法中instance.isInstAvail()返回的值将为null

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

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

如果通过设置其值或使用静态初始化程序块直接初始化这些字段,则字段顺序很重要。 它们按顺序执行。 所以你不能做一个前向参考:

private int someInt = 10 + otherInt;
private int otherInt = 22;

这不起作用,因为字段按其文本声明的顺序初始化。 如果你有两个静态初始值设定项,它们也将按顺序执行:

static { System.out.println("first"); }
static { System.out.println("second"); }

因此,在您的情况下,您在have_instance之前初始化instance ,因此后者仍为null (非基元的默认值)。 JVM将创建一个要分配给instanceMyClass对象并初始化其字段, have_instance inst_Avail的值分配给inst_Avail ,该值也将设置为null

一些读物:

这段代码非常奇怪,我没有看到用例,但是这样可以解决这个问题:

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
    }

}

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

 private static  Boolean inst_Avail=have_Instance;

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

Boolean inst_Avail=have_Instance;

要么让它static要么

constructor指定inst_Avail = true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM