ArrayIndexOutOfBoundsException при попытке сохранить ArrayList объектов, которые используют наследование - PullRequest
1 голос
/ 08 августа 2011

У меня есть 3 класса: Person, Car и Model.

Person имеет определенное свойство ArrayList:

List<Car> cars;

Car - это абстрактный класс, класс которого расширяет Model, т.е.

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

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

  public Car() {
  }

}

Модель расширяет Car:

@PersistenceCapable
public class Model extends Car {

  public Model() {
  }

}

Я загружаю объект Person и создаю новый объект Car, т.е.

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

Затем я пытаюсь сохранить новый Car с помощьюдобавив его к свойству "cars" в классе Person, т.е.

personObj.getCars().add(newCar);

Однако, когда я пробую этот App Engine, выдается следующее исключение:

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)

Это звучит очень похоже наПодобный вопрос, который был поднят здесь: http://groups.google.com/group/google-appengine-java/browse_thread/thread/adf298a9a5b4bd03

Кто-нибудь еще видел эту проблему раньше?

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Я не уверен, является ли это основной причиной вашей проблемы (если это так, это довольно не интуитивно понятный способ показать ошибку), но JDO в App Engine не поддерживает полиморфизм. Попробуйте свой пример без абстрактного класса 'Car'.

0 голосов
/ 08 августа 2011

Из того, что я понимаю, personObj.getCars() возвращает List <Car> cars;

Я делаю выводы из-за того, что вы не дали много кода, но просто наличие List <Car> cars; установит cars вnull.

Я не уверен, как работает платформа движка приложения, но она может посылать AIOOBE вместо NPE.

Какой бы ни была причина, вам следует создавать ... ... 1012 *

...