-1

Java NullPointerException に関する質問があります。

たとえば、A、B、C の 3 つのクラスがあります。

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 を私に与えています。また、methodB1() の結果、つまり methodB1() の a が必要なため、別の新しい a を再度作成することはできません。助けてください。

4

4 に答える 4

1

が呼び出される前にが呼び出されるという保証はありません。どちらもパブリック メソッドであり、他のクラスはbefore has initializedを使用できます。methodB1() methodB2()methodB2()methodB1()a

これらを 2 つの public メソッドのままにしておきたい場合、またはクラス B メソッドのいずれかが呼び出されない限り、初期化したくない場合。代わりにこれを試すことができます:ac

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 に答える
-1

パタシュが提案したように、上記のコードにタイプミスがあると思います。

クラス 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 に答える