2011-08-07 1 views
1

私には3つのクラスがあります:Person、Car、Modelです。ArrayIndexOutOfBoundsException継承を利用するオブジェクトのArrayListを永続化しようとしています

人は、ArrayListのプロパティが定義されています:

List<Car> cars; 

車は、クラスモデルが伸びる抽象クラス、すなわちです

@PersistenceCapable 
public class Model extends Car { 

    public Model() { 
    } 

} 

私はPersonオブジェクトをロードして、すなわち、新しい車のオブジェクトを作成します。

@PersistenceCapable 
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE) 
public abstract class Car { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    protected Key key; 

    public Car() { 
    } 

} 

モデルカーを拡張します

Person personObj = pm.getObjectById(Person.class, key); 
Car newCar = new Model(); 

私はPersonクラスの "cars"プロパティに新しいCarを追加することによって新しいCarを維持しようとします。 http://groups.google.com/group/google-appengine-java/browse_thread/thread/adf298a9a5b4bd03

は、他の誰がこの問題を見ている:

java.lang.ArrayIndexOutOfBoundsException: 0 
    at org.datanucleus.store.mapped.scostore.FKListStore.<init>(FKListStore.java:133) 
    at org.datanucleus.store.appengine.DatastoreFKListStore.<init>(DatastoreFKListStore.java:41) 
    at org.datanucleus.store.appengine.DatastoreManager.newFKListStore(DatastoreManager.java:528) 
    at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection(MappedStoreManager.java:729) 
    at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField(MappedStoreManager.java:646) 
    at org.datanucleus.sco.backed.List.<init>(List.java:104) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:112) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:120) 
    at org.datanucleus.util.ClassUtils.newInstance(ClassUtils.java:94) 
    at org.datanucleus.sco.SCOUtils.newSCOInstance(SCOUtils.java:164) 
    at org.datanucleus.store.mapped.mapping.AbstractContainerMapping.replaceFieldWithWrapper(AbstractContainerMapping.java:426) 
    at org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:165) 
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks(DatastoreRelationFieldManager.java:217) 
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.access$200(DatastoreRelationFieldManager.java:48) 
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.apply(DatastoreRelationFieldManager.java:116) 
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations(DatastoreRelationFieldManager.java:81) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations(DatastoreFieldManager.java:955) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.storeRelations(DatastorePersistenceHandler.java:546) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess(DatastorePersistenceHandler.java:304) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:256) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:240) 
    at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185) 
    at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161) 
    at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298) 
    at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1170) 
    at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669) 
    at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694) 

これはずっとここに上げた同様の質問のように聞こえる:私がしようとすると、

personObj.getCars().add(newCar); 

しかし、このApp Engineは、次の例外がスローされます前?私が理解から

おかげ

答えて

0

personObj.getCars()戻りList <Car> cars;

私はあなたが多くのコードを与えられていないが、ちょうどList <Car> cars;を有するnullcarsを設定するという事実による推論を作っています。

アプリエンジンプラットフォームの仕組みがわかりませんが、NPEの代わりにAIOOBEを送信している可能性があります。これは、それがある場合、それはエラーが自身を示すためにためではなく直感的な方法です(あなたの問題の根本的な原因である場合理由は、あなたがインスタンス化されなければならないものは何でも

... cars = new ArrayList();

+0

'cars 'がnullの場合、彼は' NullPointerException'を取得します。 –

0

は私はわかりません)、App EngineのJDOは多態性をサポートしていません。抽象的な 'Car'クラスなしであなたの例を試してみてください。

関連する問題