如何解决ArrayStoreException问题

And*_*dyJ 8 java arrays debugging

我读过很多关于ArrayStoreExceptions的帖子,其中大部分都属于以下类别之一:

  • 基本的误解(将基类放入子类的数组声明中)
  • 将此错误从列表转换为数组时遇到类似的误解
  • 围绕数组与泛型的"协变"问题

我的不属于这些类别.还有一个案例,OP怀疑某种类型的错误只出现在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;
Run Code Online (Sandbox Code Playgroud)

它输出:

[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
Run Code Online (Sandbox Code Playgroud)

UserValues是RecordValues的子类型.我使用有问题的类创建了一些简单的测试但无法复制错误.此外(这是非常奇怪的部分),这已经工作了六个多月.我在工具的其他部分进行了更改,但这些库附近没有任何内容.它突然爆发了.

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

我知道ArrayStoreException告诉我的是什么,我的问题是如何在故障排除方面更进一步?如果UserValues是一个RecordValues,我从哪里开始?

And*_*dyJ 1

发布后,我放弃了数组并将其更改为列表,虽然仍然失败,但给出了一个更具体的问题:

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 
Run Code Online (Sandbox Code Playgroud)

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