2017-06-16 8 views
0

コレクショントランジェントの宣言に何か問題はありますか? transient Map<String, Car> cars = new HashMap<>()は、Ownerインスタンスで宣言されていますが、Carクラスはシリアル化されていません。hasMapは、オブジェクトが非直列化された後にtransientが動作しないと宣言しました

プログラムが初めてOwnerインスタンスを実行すると、それはCarを作成し、二度目のプログラムを実行するときしかし、Ownerが非直列化されたコレクションCars、に挿入し、それが正しくCarインスタンスを作成しますが、コレクションcars.put(key, object)への追加時には、NullPointerExceptionの原因となります。また、デシリアライズ後に実行する場合にのみ、cars.containsKey(regNumIn)はtrueまたはfalseを与える代わりに例外を発生させます。 Ownerが再作成された後の2回目の実行では、新しいhashMapが作成されたようです。

hasCode()とequals()で何かする必要がありますか?私はそれらを宣言しなかった.Netbeans IDEによって自動的に宣言された場合、プログラムはまったく動作しない。

+0

Javaの 'transient'キーワードは、フィールドをシリアル化しないことを示すために使用されます。デシリアライズの後、マップの代わりに 'null'があります – ByeBye

答えて

0

Javaはデフォルトコンストラクタを呼び出すことはありません。したがって、コード

transient Map<String, Car> cars = new HashMap<>(); 

は実行されません。

ことは、これを達成するために、あなたはあなたのクラスのreadObjectメソッドをオーバーライドすることができます。

public class ... implements Serializable { 
    ... 
    private transient Map<String, Car> cars = new HashMap<>(); 
    ... 
    private void readObject(ObjectInputStream stream) 
       throws IOException, ClassNotFoundException { 
     stream.defaultReadObject(); 
     // Important! recreate transient field cars as empty HashMap 
     this.cars = new HashMap<>(); 
    } 
    ... 
} 
2

あなたの問題はコレクションとまったく関係ありません。 "transient"はJavaにフィールド値を保存しないように指示します。したがって、格納されたオブジェクトをリロードすると、transientフィールドはnull(または0、またはその他のそれぞれのデフォルト値)に設定されます。したがって、例コードcars.put(key, object)では、本質的にnull.put(key, object)を実行しようとしています。

containsKeyも同じ理由で失敗します。これは、nullという名前で呼び出そうとしています。

コレクションをシリアル化したくない場合は、デシリアライズした後にcars = new HashMap<>()のような処理を行う必要があります。

つまり、この問題はequalshashCodeとは無関係ですが、Netbeansを生成したときにプログラムが「中断する」という情報は、他にも問題がある可能性があることを示しています。 equalshashCodeについての良い情報は、この関連のSOの質問で見つけることができます。オブジェクトをデシリアライズするとき

What issues should be considered when overriding equals and hashCode in Java?

-1

私はtransient文を削除し、私はCarクラスにSerializableインタフェースを実装し、それが動作します。最初の実行後にコレクションがtransientで保存されていなかったことと、Ownerオブジェクトが逆シリアル化されたときに2回目に実行されるという問題があったと考えているため、引数のないコンストラクタが呼び出されないため、そのコンストラクタの新しいcarsコレクションは作成されません。したがって、2回目の実行では、既存のコレクションにオブジェクトcarを追加しようとしました。

関連する問題