2017-04-22 66 views
-2

获得NullPointerException异常,C1为主要方法初始化,将在后面的Class2访问的情况,但我得到的NullPointerExceptionNullPointerException异常静态引用变量

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); 
    } 
} 
+1

“稍后访问” - 否,在**之前访问**。使用调试器逐步完成。 –

回答

1

要分配Test.c1的价值,首先需要完全构造一个Class1的实例。

但是,当您构造Class1时,您将Class2构造函数调用到class1()方法中,该方法依次打印一些内容。在这一点上,你还没有完全构建Class1的情况下,作为结果,Test.c1尚未初始化

0

这是相当简单:

  1. Test被加载,c1获得它的缺省值为null

  2. mainjava工具调用。

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

    1. Class1的构造函数调用class1

      1. class1要求Class2的构造函数。

        1. Class2的构造试图取消引用Test.c1,这是null,所以它抛出。

它只会是一旦嵌套系列完成了c1将获得价值。但是由于代码在它具有(非null)值之前尝试使用它,它会失败。

用调试程序遍历代码可以使这个东西更加清晰。使用调试器并不是一项高级技能,它对于初学者来说至关重要,可以作为一种学习工具,用于发生什么情况。

相关问题