我已经阅读了许多有关ArrayStoreExceptions的帖子,其中大多数属于以下类别之一:

  • 基本误解(将基类放入子类的数组声明中)
  • 类似的误解,同时使此错误从列表转换为数组
  • 关于数组与泛型
  • 的“协变量”问题

    我的不属于任何这些类别。 OP有one other case,它怀疑只有在Unix上才出现的某种错误。我认为我正在处理此案,我不确定如何进一步解决该问题。

    我已经尽力分解了代码,看起来像这样:
    System.out.println("Declaring RecordValues array");
    RecordValues[] rv = new RecordValues[3];
    System.out.println("This array is meant for "+rv.getClass().getComponentType());
    System.out.println("Adding user defaults which is: "+userdefaults.getClass().getName());
    System.out.println("Its parent is: "+userdefaults.getClass().getSuperclass().getName());
    rv[0] = userdefaults;
    System.out.println("Adding templvalues which is: "+tmplvalues.getClass().getName());
    rv[1] = tmplvalues;
    System.out.println("Adding sessionvalues which is: "+tmplvalues.getClass().getName());
    rv[2] = sessionvalues;
    

    它输出:
    [ant:createwo] Declaring RecordValues array
    [ant:createwo] This array is meant for class org.kp.mbe.arscli.datamap.RecordValues
    [ant:createwo] Adding user defaults which is: org.kp.mbe.arscli.datamap.UserValues
    [ant:createwo] Its parent is: org.kp.mbe.arscli.datamap.RecordValues
    :createwo FAILED <--
    ...
    Caused by: java.lang.ArrayStoreException: org.mbe.arscli.datamap.UserValues
    

    UserValues是RecordValues的子类型。我已经使用有关的类创建了一些简单的测试,但是无法复制该错误。另外(这是真正的怪异部分),这已经工作了六个多月。我已经对该工具的其他部分进行了更改,但是这些库附近没有任何更改。它突然突然弹出。

    我想知道还有什么可能导致ArrayStoreException。我100%确定UserValues是RecordValues的子类,但是,一旦我尝试将其添加到数组中,它就会失败。主机是64位RH linux,OpenJDK java版本1.7.0.45。

    我知道ArrayStoreException告诉我什么,我的问题是如何在故障排除中更进一步?如果UserValues是A RecordValues,那我从哪里去呢?

    最佳答案

    发布后,我放弃了该数组,将其更改为List,尽管仍然失败,但产生了一个更具体的问题:

    Caused by: java.lang.LinkageError: loader constraint violation: when
    resolving method
    "org.mbe.arscli.datamap.ValueResolver.resolve(Ljava/util/List;)Lorg/mbe/arscli/datamap/RecordValues;"
    the class loader (instance of org/apache/tools/ant/loader/AntClassLoader5) of the current class,
    org/build/ant/CreateRemedyWo, and the class loader (instance of java/net/URLClassLoader) for resolved class,
    org/mbe/arscli/datamap/ValueResolver, have different Class objects for the type )Lorg/mbe/arscli/datamap/RecordValues; used in the
    signature
    

    正如@Taylor猜测的那样,这是由多个类加载器通过gradle引起的。尽管我很长一段时间都没有更改此代码,但是最近我更改了构建文件中的依赖项声明。幸运的是,我从列表中得到的错误比数组中的错误更精确!

    09-07 20:17