为什么我的类字段在初始化后仍然指向null?

时间:2013-05-21 05:49:29

标签: java class nullpointerexception

我有一个Java NullPointerException问题。

例如: 我有三个班级A,B和C.

public class A
{
    public void methodA1()
    {    }
}
//////////////////////////////
public class B
{
    private A a;
    private C c;

    public void methodB1()
    {
        a = c.methodC1;
    }

    public void methodB2()
    {
        a.methodA1();
    }
}
/////////////////////////////
public class C
{

  public A methodC1()
  {
       return new A();
  }
}

正如您可以看到上面的代码,主要问题在于B类。我的问题是,如果B类中的字段a在methodB1中初始化,为什么我不能在methodB2中再次使用?编译器给我使用代码a.methodeA1()的NullPointerException。而且我不能再创建另一个新的a因为我需要methodB1()的结果,即methodB1()中的a。请帮忙。

4 个答案:

答案 0 :(得分:4)

您创建了C类的对象,但忘记将其分配给新对象

public class B
{
    private A a;
    private C c;

    public void methodB1()
    {
        c = new C(); // Added 
        a = c.methodC1(); // the problem was here  
    }

    public void methodB2()
    {
        a.methodA1();
    }
}

您可能想了解NullPointerException

构造函数中,您必须首先调用methodB1(),如下所示:

    public B(){
    this.methodB1();
    this.methodB2();
    }

    public static void main(String...args){
      new B();
     }

由于避免了a NullPointerException ,正如您在 methodB1 中看到的那样,您分配了一个新对象ot a

答案 1 :(得分:1)

无保证 methodB1()methodB2()之前将被称为 - 两者都是公共方法,任何其他类都可以使用{在methodB2()初始化methodB1()之前{1}}。

如果确实希望将这些方法保留为两种公共方法,那么确实不想初始化aa除非调用你的一个B类方法。你可以试试这个:

c

除非public class B{ private A a; private C c; public void methodB1(){ if(c == null){ methodB3(); } a = c.methodC1; } public void methodB2(){ if(a == null){ methodB1(); } a.methodA1(); } public void methodB3(){//Allows other classes to initialize c directly c = new C(); //though 'c' is still private so can only be accessed } //by methodB1() } 和/或a非常“昂贵”(即花费大量时间,系统资源等),否则通常会更容易确保你在声明变量时已经初始化了变量。

我建议阅读这篇关于如何初始化变量的好文章:http://www.artima.com/designtechniques/initializationP.html

答案 2 :(得分:0)

a= c.method1;不会初始化它。你正在调用一个方法,代码应该是

c= new C();    
a=c.method1();

答案 3 :(得分:-1)

我认为您在上面的代码中有一些拼写错误,正如Patashu建议的那样。

这就是B级的方式:

public class B

{

private A a;
private C c;

public static void main(String []a)
{
    B b=new B();
    b.methodB1();
    b.methodB2();
}

public void methodB1()
{
    c= new C();
    a = c.methodC1();
    System.out.println("Inside Method B1");
}

public void methodB2()
{
    a.methodA1();
    System.out.println("Inside Method B2");
}

}

////////////////////////////////////////// 这是A类:

  public class A
{

   public void methodA1()
    {  
      System.out.println("This is class A");  
    }
}

这对我的JVM工作得很好......可能是JVM存在问题?不确定!但上面的代码工作得非常好。