-5

私は本当に奇妙な問題を抱えています。(非常に重要な注意:これは元のコードを貼り付けることができない例です。コンパイラなしでテキストとして書きました。)私には2つのクラスがあります:

class B {
    private int num = 9;

    public int getNum(){
       return num;
    }

    public void setNum(int num){
       this.num = num;
    }
}

class A {
    private B b = new B();

    public void setB(B b){
        b.setNum(b != null? b.getNum() : 8);
   }

   public B getB(){
       if (b == null)
           System.out.println("How possible?");
       return b;
   }
}

今、時々私は印刷物を手に入れます...しかし、どうしてそれが可能かわかりません。

A はシリアル化されたクラスですが、まだわかりません。

4

7 に答える 7

5

それは不可能です、いいえ。A.getB()コンパイルしようとすると、の定義で型エラーが発生し、定義A.setB()も疑わしいように見えます(shadows b)。

于 2009-10-08T08:20:34.257 に答える
3

bnull になる可能性のある状況がいくつかあります。

  • 反射。b反射的に null に設定される可能性があり、これによりセッターが回避されます。
  • カスタムシリアル化。bnull として明示的に復元される場合があります。または、シリアル化できない場合Bは、エラーを回避するために一時的なものとしてマークし、復元されません。

単純なシリアル化ワークフローを確認するには、次のコードを使用します。

    Object object = "someString";

    ByteArrayOutputStream holder = new ByteArrayOutputStream();
    new ObjectOutputStream(holder).writeObject(object);

    Object readObject = new ObjectInputStream(new ByteArrayInputStream(holder.toByteArray())).readObject();

    System.out.println(readObject);

最初の行は、テストしたい実際のオブジェクトに置き換えられます

于 2009-10-08T08:42:12.217 に答える
2

のインスタンスをシリアル化するとAb == nullNPE が発生します。その理由は、デシリアライゼーション中にコンストラクターが呼び出されないため、private B b = new B();実行されず、bままになるためnullです。

于 2009-10-08T08:33:31.900 に答える
1

B の初期化をクラスに追加する前に、A のインスタンスをシリアル化しましたか?
その場合、コンストラクターが呼び出されないため、b が null の A のインスタンスを取得できます (クラスのメンバーの初期化は、暗黙的なコンストラクターの一部です)。
次に、 readObject() の実装をクラス A に追加する必要があります。そこで、b が null かどうかを確認し、必要に応じて初期化できます。

于 2009-10-08T08:35:00.913 に答える
0

アイデア: 交換

System.out.println("How possible?");

new Exception().printStackTrace();

これにより、直前に何が起こったかを簡単に確認できるはずです。それ以外の場合、詳細な情報がなければ、考えられる原因はシリアライゼーションだけです。

于 2009-10-08T09:03:15.803 に答える
0

この行もコンパイルされません:

b.setNum(b != null? b.getNum : new B());
于 2009-10-08T08:23:37.637 に答える
0

さて、これはどうですか?B をパラメーターとして指定する場合は、それを使用してみませんか?

class A {
    private B b = new B();

    public void setB(B b){
        if(b != null) {
            this.b = b;
        }
   }

   public B getB(){
       return b;
   }
}
于 2009-10-08T08:25:17.767 に答える