-1

我有一个 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?编译器给了我使用代码 a.methodeA1() 的 NullPointerException。而且我无法再次创建另一个新a,因为我需要methodB1() 的结果,即methodB1() 中的a。任何帮助,请。

4

4 回答 4

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();
     }

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

于 2013-05-21T05:54:53.910 回答
1

不能保证会在之前methodB1()调用- 两者都是公共方法,任何其他类都可以使用before has initialized 。 methodB2()methodB2()methodB1()a

如果您真的想将它们保留为两个公共方法,并且您真的不想初始化a,或者c除非调用您的 B 类方法之一。你可以试试这个:

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和/或c创建起来非常“昂贵”(即占用大量时间、系统资源等),否则在声明变量时确保已初始化变量通常会更容易。

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

于 2013-05-21T06:51:25.953 回答
0

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

c= new C();    
a=c.method1();
于 2013-05-21T05:55:50.763 回答
-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 可能有问题吗?没有把握!但是上面的代码工作得很好。

于 2013-05-21T06:12:06.340 回答