静态引用变量的情况下为NullPointerException

时间:2017-04-22 20:53:16

标签: java nullpointerexception

获取NullPointerException,c1在main方法中初始化,稍后在class2中访问,但我得到NullPointerException

public class Test
{
    static Class1 c1;
    public static void main(String[] args) 
    {
        c1 = new Class1();    //c1 is initialized, still null pointer exception
    }  
}

public class Class1 
{
    int a,b;
    Class1()
    {
        class1();
    }
    void class1()
    {
        a = 5;
        b = 10;
        Class2 class2 = new Class2();
    }
}

public class Class2 
{
    Class2()
    {
        Class1 c = Test.c1;         //c1 is null here
        System.out.println(c.a);    //NullPointerException for Test.c1
        System.out.println(c.b);
    }
}

2 个答案:

答案 0 :(得分:1)

要分配Test.c1的值,首先需要构建完全 Class1的实例。

但是,在构造Class1时,可以将Class2构造函数调用到class1()方法中,然后再打印一些东西。此时,您仍然没有完全构造Class1实例,因此,Test.c1尚未初始化

答案 1 :(得分:0)

这很简单:

  1. 加载Test后,c1会获得默认值null

  2. mainjava工具调用。

  3. main调用Class1的构造函数。

    1. Class1的构造函数调用class1

      1. class1调用Class2的构造函数。

        1. Class2的构造函数尝试取消引用Test.c1 null,因此它会抛出。
  4. 只有一次嵌套系列完成,c1才会收到一个值。但是,由于代码在具有(非null)值之前尝试使用它,它会失败。

    使用调试器逐步调试代码可以使这些内容更加清晰。使用调试器不是一项高级技能,对初学者来说至关重要,作为学习工具的时间。